diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 09dd1da..0000000 --- a/.gitignore +++ /dev/null @@ -1 +0,0 @@ -venv/* diff --git a/CNAME b/CNAME deleted file mode 100644 index fe1482e..0000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -docs.euro-linux.com diff --git a/HowTo/migrate_to_rocky_linux/index.html b/HowTo/migrate_to_rocky_linux/index.html index 7c4c9d7..7cff791 100644 --- a/HowTo/migrate_to_rocky_linux/index.html +++ b/HowTo/migrate_to_rocky_linux/index.html @@ -1505,43 +1505,43 @@

Procedure for migrating EuroLinux to RockyLinux

    -
  1. Preparation:
  2. +
  3. +

    Preparation:

    +
  4. Download migration scripts:

    -
  5. +
  6. Migration:

    -
  7. -
  8. -

    Migrating EuroLinux 8 to RockyLinux 8: -

    sudo bash migrate2rocky.sh -r
    -

    -
  9. -
  10. -

    Migrating EuroLinux 9.4 to RockyLinux 9.4:

      +
    • Migrating EuroLinux 8 to RockyLinux 8: +
      sudo bash migrate2rocky.sh -r
      +
    • +
    • Migrating EuroLinux 9.4 to RockyLinux 9.4:
      • If RockyLinux has not yet released version 9.5: -
        sudo bash migrate2rocky9.sh -r
        +  
        sudo bash migrate2rocky9.sh -r
         
      • If RockyLinux has already released version 9.5 or higher: -
        sudo bash migrate2rocky9.sh -rv 9.4
        +  
        sudo bash migrate2rocky9.sh -rv 9.4
         
    • +
    +
diff --git a/README.md b/README.md deleted file mode 100644 index b5e671e..0000000 --- a/README.md +++ /dev/null @@ -1,133 +0,0 @@ -# EuroLinux - - -## About Documentation -This is EuroLinux community-driven documentation. - -**We welcome your contributions to EuroLinux!** - -You can: - -- star the repository to show your support -- contribute via a Pull Request - see [How to contribute](#how-to-contribute) -- create requests for a particular topic via [Issue Creation on - GitHub](https://github.com/EuroLinux/eurolinux-open-docs/issues/new/choose) - - - -!!! info additional documentation - As EuroLinux is in Open Core model there are also additional documentation - for our customer that are available at [EuroLinux Support - Portal](https://support.euro-linux.com). - - -!!! info EuroLinux man Pages - You can find our online Enterprise Linux Man pages server here - [https://man.docs.euro-linux.com](https://man.docs.euro-linux.com). - - -## How documentation is organized? - -Documentation is organized in the following manner: - -- JumpStarts - Installation guides with extras -- HowTo - How To guides on various topics -- Release Notes - -## How to contribute - -We love your input! We value transparent and easy to contribute projects, that's -why we choose GitHub. You can contribute to this project with: - -- Proposing a new topic that should be described -- Discussing the current state of the docs -- Reporting a bug -- Submitting a fix - -**We Use GitHub with GitHub Flow. All changes are made through pull requests.** - -Pull requests are the best and well-established way to propose changes. The -GitHub Flow that allows us to provide reviews and discussion about documentation/code -is described in detail [here](https://docs.github.com/en/get-started/quickstart/github-flow). - -Use our specially crafted issue templates: [EuroLinux Open Docs issue from a -template](https://github.com/EuroLinux/eurolinux-open-docs/issues/new/choose) to -contribute a topic you would like to see. - -If you want to contribute with code (we keep documentation as code), do the -following: - -1. Fork the repository and create your own branch from master. -2. It would be great if you could test your changes with mkdocs (described in - detail in [Setup environment locally](#setup-environment-locally)) -3. Write/Apply your changes and commit to your branch. -4. Create a pull request! - -### GitHub Labs - -If you are new to Git VCS (Version Control System) or GitHub, you can visit -[GitHub Learning Lab](https://lab.github.com/), especially [First Day on GitHub -course](https://lab.github.com/githubtraining/first-day-on-github). GitHub -courses are free, interactive and put stress on practical aspects. - -## Tools -We are using `mkdocs` with `mkdocs-material` to build and style our -documentation. - -- [MkDocs site](https://mkdocs.readthedocs.io/en/stable/) -- [Material for MkDocs site](https://squidfunk.github.io/mkdocs-material/) - - -## Setup environment locally - -Because MkDocs is Python based, you need at least these installed to run this -documentation locally: - -- python3 (3.6+) -- pip -- virtualenv - -First, let's create a virtualenv, so you don't bloat your system-wide python -environment: -``` -virtualenv -p /usr/bin/python3 venv -``` - -Then activate virtualenv - -Bash: -```bash -. venv/bin/activate -``` - -Fish: -```fish -. venv/bin/activate.fish -``` - -Now you are ready to install MkDocs and other Python packages: -``` -pip install -r requirements.txt -``` - -After it serving documentation on your host is as easy as running: -``` -mkdocs serve -``` - -To build documentation invoke: -``` -mkdocs build -``` - -It will build documentation and save it into `site` directory - -!!! warning "Please don't include site directory in pull requests" - Because we deploy this documentation with GitHub Pages, the `site` - directory is not gitignored - - -## Markdown cheat sheet for this project -We created simple cheat sheet for MkDocs markdown syntax with extensions -enabled in this project. It can be found -[here](HowTo/z-documentation-markdown.md). diff --git a/docs/HowTo/centos8-eol-solution.md b/docs/HowTo/centos8-eol-solution.md deleted file mode 100644 index 0b86c38..0000000 --- a/docs/HowTo/centos8-eol-solution.md +++ /dev/null @@ -1,95 +0,0 @@ -# CentOS 8 End of Life - solution - -## Introduction - -This how-to provides a solution to the problem of CentOS 8 running out of -support. -With the end of 2021, CentOS ended its life in its stable form -and started functioning as CentOS Stream, a development branch for Red Hat® -Enterprise Linux®. As a result, it stopped receiving proven, stable updates -and its use, especially in production environments, became risky. This is -a very serious problem for many companies and individuals around the world. So -there was an urgent need to find a new source of updates for CentOS in order -to keep it in the infrastructure. A complete solution to this problem is -support switching, that is, pointing to a new repository from which CentOS -will be downloading stable updates. Such a solution is offered by EuroLinux. -It is worth mentioning that both CentOS and RHEL and EuroLinux are systems -built on the same source code, so they provide the same functionality. They -differ mainly in branding. - -The operation of switching support is simple, reasonably safe and completely -reversible. What is very important, it requires neither reinstallation of the -system nor the applications installed on it. The process consists of switching -the repository, installing the el-release package, updating the system and -reinstalling the system packages in-place. -After the in-place migration, CentOS will still be usable, even in production -environments. - -All resources used in this tutorial can be found in the [additional -resources section](#additional-resources). - -## The solution - -A project named *eurolinux-migration-scripts* has been created. It contains -among others a script that will take care of the migration automatically. Here -we describe, how to perform the switch successfully. - -### Preparations - -It's vital that the system be updated to the newest release. Use the following -command: - -```bash -sudo yum update -y -``` - -### Running the migration script - -Then download the [latest production-ready -release](https://github.com/EuroLinux/eurolinux-migration-scripts/archive/refs/heads/master.zip) -of the project containing the script. Unpack the release, visit the -unpacked directory and run the script - usually this will require -right-clicking in the current directory, using the 'Open in Terminal' option -and running this command: - -```bash -sudo bash migrate2eurolinux.sh -``` - -Refer to the project's README for additional commands. - -### After the switch - -Once the migration has finished, it's recommended to reboot your system: - -```bash -sudo reboot -``` - -Once the system has rebooted, the migration process can be considered -complete. -In order to quickly verify that it was carried out successfully, we -can check the distribution description: - -```bash -cat /etc/el-release -``` - -As a result we should get a response about the distribution and latest -EuroLinux version. - -## Conclusion - -As you can see, the process is quick and seamless. You can switch the -repository for RHEL, Oracle Linux, AlmaLinux, and Rocky Linux the same way. -In each case, the process will look almost identical. - -If you have any questions or concerns, please submit them to the repository -linked in the [additional resources section](#additional-resources). Thank you. - -## Additional resources - -- [EuroLinux support switching script GitHub - repository](https://github.com/EuroLinux/eurolinux-migration-scripts) -- [Latest production-ready release of the - project](https://github.com/EuroLinux/eurolinux-migration-scripts/archive/refs/heads/master.zip) diff --git a/docs/HowTo/create-iso-with-repositories.md b/docs/HowTo/create-iso-with-repositories.md deleted file mode 100644 index 2e0db76..0000000 --- a/docs/HowTo/create-iso-with-repositories.md +++ /dev/null @@ -1,82 +0,0 @@ -# How to create ISO file with EuroLinux repositories - -Creating ISO that contains RPM repositories is a straightforward process. First -you have to mirror repositories locally - mirroring is described in [Mirror -EuroLinux Locally How To](mirror-eurolinux-locally.md). - -To create an ISO file, you need `mkiso` command that is part of `genisoimage` -package. You can install it with the following command: - - -```bash -sudo yum install -y genisoimage -``` - -## Creating ISO with repositories - -In the example below, we create ISO from the repositories saved in `/repos` -directory the output is saved to `/var/eurolinux-repos.iso`. -``` -sudo mkisofs -R -J -o /var/eurolinux-repos.iso /repos/ -``` - -This file could be: - -- locally copied to the machine that will be using it -- added to ISOs pool of Virtual Machine manager/orchestrator or cloud computing - platform of your choice - -## Mounting ISO from local file - -Mounting local ISO file is as simple as: - -```bash -sudo mount -o loop /PATH/TO/ISO /MOUNT/PATH -``` - -example: - -```bash -sudo mount -o loop /var/eurolinux-repos.iso /mnt/mirror -``` - -## Mounting ISO from virtual cd-rom device - - -Mounting CD-ROM device is as simple as: - -```bash -sudo mount /dev/DEVICE /MOUNT/PATH -``` - -The following example has ISO mounted as CD-ROM device `/dev/sr0`: - -```bash -sudo mount /dev/sr0 /mnt/mirror -``` - -## Using locally mounted ISO with RPM repositories - -To use the repositories, that the ISO file provides, create a proper `.repo` -file that resides inside `/etc/yum.repos.d/` directory. - -Here is an example `/etc/yum.repos.d/local-iso.repo` file for EuroLinux 7 and -the ISO image attached to `/mnt/mirror` directory. - -```ini -[base] -name = EuroLinux 7 x86_64 Base -baseurl=file:///mnt/mirror/eurolinux-os-7/ -enabled=1 -# Disabled gpgcheck, enable if el-release is already installed on your system -gpgcheck=0 -gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7 - -[updates] -name = EuroLinux 7 x86_64 Updates -baseurl=file:///mnt/mirror/eurolinux-updates-7/ -enabled=1 -# Disabled gpgcheck, enable if el-release is already installed on your system -gpgcheck=0 -gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7 -``` diff --git a/docs/HowTo/docker.md b/docs/HowTo/docker.md deleted file mode 100644 index 670e00b..0000000 --- a/docs/HowTo/docker.md +++ /dev/null @@ -1,95 +0,0 @@ -# Docker - -How to set up your Docker Community Edition installation. - -## Introduction - -### Use cases - -Consider the following examples: - -- You want a standardized runtime environment across production, QA and - developer scenarios. -- You want all the runtime environment's specification in a single file, what - is easy to manage through version control systems. -- You want the environment to be reproducible. After all, it's just a matter of - building an image from the specification and once it's done it is already -self-documented on what steps were taken to cook the final image. -- You prefer a layered architecture and the ability to cache artifacts across - several images and backup & restore the images easily. - -### Why use Docker containers over virtual machines? - -In short: Docker containers utilize Linux's capabilities such as cgroups and -namespaces to create an isolated environment and do not virtualize hardware. -Therefore, they are way more lightweight than virtual machines and can be -brought up in a large scale in a blink of an eye rather than waiting for a -single virtual machine to boot. - -For more information, take a look at our blog entry on [the basics of -containerization](https://en.euro-linux.com/blog/the-basics-of-containerization/). - -## System requirements - -The following operating systems and architectures are covered by this guide: - -- EuroLinux 8 on the x86_64 and aarch64 architecture. -- EuroLinux 7 on the x86_64 architecture. - -Make sure the containers you want to run are of the same architecture as your -machine. - -If you need support with installation on the EuroLinux releases this guide does -not cover, please create an appropriate ticket. - -## Installation - -### EuroLinux 8 - -The following steps are based on [Docker, Inc. official guide as of -2022.02.01](https://web.archive.org/web/20220201054013/https://docs.docker.com/engine/install/centos/). -We will just use the commands provided as snippets for a quick way of copying -& pasting one snippet for a successful installation. - -The following snippet installs Docker on EuroLinux 8.6. Other releases may work -as well, but have not been tested. Once a new EuroLinux release is out, this -guide will be updated. - -!!! danger "Docker installation removes podman and buildah" - Please note that this operation will replace **runc** with **containerd.io** - and remove both **podman** and **buildah**. - -``` -sudo yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine -which yum-config-manager || sudo yum install -y yum-utils -sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo -sudo yum install -y docker-ce docker-ce-cli containerd.io --allowerasing -sudo systemctl enable docker --now -``` - -### EuroLinux 7 - -EuroLinux provides their own builds of Docker for EuroLinux 7. - -Please prepare your EuroMan credentials and enable the -`el-server-7-extras-x86_64` channel first, like so: - -``` -sudo rhn-channel -u "$el_euroman_user" -p "$el_euroman_password" -c el-server-7-extras-x86_64 -a -``` - -Then you are ready to install Docker: - -``` -sudo yum install -y docker -sudo systemctl enable docker --now -``` - -## What's next? - -[EuroLinux provides several Docker images for you to -use](https://hub.docker.com/u/eurolinux). They are publicly available and free -of charge. Take a look at our entry [*EuroLinux docker images are now -available*](https://en.euro-linux.com/blog/eurolinux-docker-images-are-now-available/) -for more information. Additionally, [we provide a quick guide for having the -images up and running in no time](../jumpstarts/container-jumpstart.md). diff --git a/docs/HowTo/els.md b/docs/HowTo/els.md deleted file mode 100644 index 591402c..0000000 --- a/docs/HowTo/els.md +++ /dev/null @@ -1,55 +0,0 @@ -# Migrate to EuroELS - -This guide is about how to switch your repositories to the ones provided by EuroLinux Extended Life Support. - -## Introduction - -Enterprise Linuxes 6 ended their life a few years ago. Still, security updates can be provided by several vendors for a fee. That's where EuroELS comes in. You can extend the lifecycle of your Enterprise Linux up to the half of 2024. - -## How to migrate - -First, make sure that your system is up to date. It should be CentOS 6.10 (minor version 10). - -``` -su -yum update -y -``` - -Second, in accordance with good practice, we recommend backing up your machine. - -Please download the migration script available at this location: - -https://github.com/EuroLinux/eurolinux-migration-scripts.git - -``` -wget https://github.com/EuroLinux/eurolinux-migration-scripts/archive/refs/heads/el6-only-switch-repos.zip -``` - -Please unpack the downloaded file: - -``` -unzip el6-only-switch-repos.zip -``` - -and navigate to the script's directory: - -``` -cd eurolinux-migration-scripts-el6-only-switch-repos -``` - -To start the switching process, just run the script with administrator privileges: - -``` -./migrate2eurolinux.sh -``` - -Once the command is executed, we'll get a recommendation to make a backup. Type YES to make the script continue. - -The script will ask us about our EuroMan credentials. We provide our login and password when asked. - -The repository switch has completed successfully. We can now update our Enterprise Linux 6 with the command: - -``` -yum update -y -``` - diff --git a/docs/HowTo/ha-rs-enable-repository.md b/docs/HowTo/ha-rs-enable-repository.md deleted file mode 100644 index 1cba9b6..0000000 --- a/docs/HowTo/ha-rs-enable-repository.md +++ /dev/null @@ -1,157 +0,0 @@ -# How to install High Availability and Resilient Storage in EuroLinux 8 - -For EuroLinux 8.4, you should update the `el-release` package. The newer -version has `resilient-storage` and `high-availability` repositories saved in -the `/etc/yum.repos.d/certify.repo` file. - -``` -sudo yum update -y el-release -``` - -!!! info "'certify-' prefix" - Since EuroLinux 8.6 the 'certify-' prefixes in repo URLs and names are no - longer used. These URLs are and will be kept as the symbolic link for - backward compatibility. The `certify.repo` file will be used for the whole - EuroLinux 8 lifecycle. - - -If you cannot update the release package because the new `el-release` package errata -is not security-related, you might manually add the following to the -`/etc/yum.repos.d/certify.repo` - -``` -[high-availability] -name = EuroLinux High Availability -baseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/HighAvailability/os -enabled=0 -gpgcheck=1 -gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8 - -[resilient-storage] -name = EuroLinux Resilient Storage -baseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/ResilientStorage/os -enabled=0 -gpgcheck=1 -gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8 -``` - -## Enabling repositories permanently - -### Enabling High Availability and Resilient Storage repository manually - -Use your favourite text editor and change `enabled=0` to `enabled=1` for -`high-availability` and `resilient-storage` repositories. - -Before edit: -``` -[resilient-storage] -name = EuroLinux Resilient Storage -baseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/ResilientStorage/os -enabled=0 -gpgcheck=1 -gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8 -``` - -After Edit: - -``` -[resilient-storage] -name = EuroLinux Resilient Storage -baseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/ResilientStorage/os -enabled=1 -gpgcheck=1 -gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8 -``` - -You should do the identical changes for high-availability repositories. - -### Enabling High Availability and Resilient Storage repository with yum-config-manager - -The `yum-config-manager` command is part of the `yum-utils` package. Firstly -let's install that package: - -```bash -sudo yum install -y yum-utils -``` - -Then enable Resilient Storage and High Availability repository with the -following command: - -``` -sudo yum-config-manager --enable high-availability -sudo yum-config-manager --enable resilient-storage -``` - -## Installing HA and/or Resilient Storage - -Both High Availability and Resilient Storage have rpm groups, so installing -them is trivial. - -To install the High Availability add-on, invoke the following command: - -``` -sudo yum install -y @ha -``` - -To install the Resilient Storage add-on, invoke the following command: - -``` -sudo yum install -y @resilient-storage -``` - -## Basic HA configuration - -### Configuring firewalld - -Before configuring a firewall, it's appropriate to check if firewalld is actually -running. The standard `systemctl is-active` command is one of the options. - -``` -systemctl is-active firewalld -``` - -For a system that has firewalld started and enabled, you might use good -enough configuration with: - -``` -sudo firewall-cmd --permanent --add-service=high-availability -sudo firewall-cmd --reload -``` - -### Starting pcsd - -After configuring a firewall, you can start and enable pcsd (PCS GUI and remote -configuration interface) with the following commands: -``` -sudo systemctl start pcsd.service -sudo systemctl enable pcsd.service -``` - -To make a very basic test of the pcsd installation, we recommend setting -`hacluster` user password. As `root` user, you can, for example invoke: - -``` -# echo "secret-pass" | passwd hacluster --stdin -``` - -Then login into Pacemaker/Corosync configuration. Use the machine address on -port 2224 (example: `https://MACHINE_IP:2224`) in your browser. The -username is `hacluster` with password you set in previous step. - -!!! warning "HTTPS Required" - Web browser like Firefox and other programs like cURL will report - "Connection reset by peer" or "The connection was reset" when connecting - with cleartext HTTP. - ``` - [root@test1 pcsd]# curl localhost:2224 - curl: (56) Recv failure: Connection reset by peer - ``` - -From this point you can freely configure High Availability and Resilient -Storage. We recommend using upstream documentation provided in Additional Links -below. - -## Additional links - -- [Red Hat Documentation - Configuring and Managing High Availability Clusters](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_and_managing_high_availability_clusters/index) -- [Red Hat Documentation - Configuring GFS2 File System](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_gfs2_file_systems/index) diff --git a/docs/HowTo/install-epel-on-eurolinux.md b/docs/HowTo/install-epel-on-eurolinux.md deleted file mode 100644 index 1e29d20..0000000 --- a/docs/HowTo/install-epel-on-eurolinux.md +++ /dev/null @@ -1,35 +0,0 @@ -# How to Install and Enable EPEL repository on EuroLinux 8 - -EPEL (Extra Packages for Enterprise Linux) repository is one of the most -popular third-party repositories for the Enterprise Linux family. From the 4th -November EuroLinux team included the original `epel-release` package from EPEL in -the BaseOS repo. It was the most voted **small quality of life change** during our -first community meeting. The package is re-signed with a EuroLinux GPG key, so -there is no need to accept an external key to install this particular package. - - -The package version will be checked and updated if necessary **during minor -releases**. - - -!!! info "EPEL is an external repository that is community supported" - As a company, we cannot provide proper care in terms of security, quality, - support and lifecycle standards on a third-party repository. Nevertheless, the - EPEL repository has a great history of community support. - - -## Installing EPEL on EuroLinux - -Installing EPEL on EuroLinux 8 and EuroLinux 7 is as simple as: - -```bash -sudo yum install -y epel-release -``` - -!!! info "EPEL is enabled by default" - The base EPEL repository is enabled by default for modular (EuroLinux 8) - and non-modular packages. You can enable debuginfo and source packages in - respective `/etc/yum.repos.d/epel*.repo` file. - -From this moment, you can install and then use all EPEL goodies like `htop`, `wine` or -`createrepo`. diff --git a/docs/HowTo/migrate_to_rocky_linux.md b/docs/HowTo/migrate_to_rocky_linux.md deleted file mode 100644 index 6194dd2..0000000 --- a/docs/HowTo/migrate_to_rocky_linux.md +++ /dev/null @@ -1,33 +0,0 @@ -# Procedure for migrating EuroLinux to RockyLinux - -1. Preparation: - - Ensure a stable and reliable internet connection throughout the entire migration process. This is critical for downloading scripts and packages. - - Create a full backup of the system to be migrated. - - Test the recovery procedure to ensure you can restore the system in case of interruption or errors during migration. - - It is recommended to run the migration in a session manager, e.g., tmux. - -2. Download migration scripts: - - For EL8: - ``` - curl -O https://raw.githubusercontent.com/EuroLinux/rocky-tools/feature/vaulted_migration/migrate2rocky/migrate2rocky.sh - ``` - - For EL9: - ``` - curl -O https://raw.githubusercontent.com/EuroLinux/rocky-tools/feature/vaulted_migration/migrate2rocky/migrate2rocky9.sh - ``` - -3. Migration: - - Migrating EuroLinux 8 to RockyLinux 8: - ``` - sudo bash migrate2rocky.sh -r - ``` - - - Migrating EuroLinux 9.4 to RockyLinux 9.4: - - If RockyLinux has not yet released version 9.5: - ``` - sudo bash migrate2rocky9.sh -r - ``` - - If RockyLinux has already released version 9.5 or higher: - ``` - sudo bash migrate2rocky9.sh -rv 9.4 - ``` diff --git a/docs/HowTo/mirror-eurolinux-locally.md b/docs/HowTo/mirror-eurolinux-locally.md deleted file mode 100644 index cb4f84e..0000000 --- a/docs/HowTo/mirror-eurolinux-locally.md +++ /dev/null @@ -1,288 +0,0 @@ -# How to set up internal EuroLinux RPM mirror - -This short how-to instructs how to set up your own **internal** EuroLinux mirror. -External (publicly available) mirrors should not be set up this way. - -## System requirements - -- Internet connection for sync server is required -- The firewall must allow connection to EuroLinux servers -- For each version of EuroLinux, you need about 80 GB of storage -- You have to install utilities like reposync and createrepo. The - following command will work on an Enterprise Linux 7 and 8: - ```bash - # --skip-broken because depending on the version not all packages might be present - sudo yum install -y createrepo_c createrepo yum-utils dnf-utils --skip-broken - ``` - -## Mirroring EuroLinux 9 - -Making a local mirrors for EuroLinux 8 and EuroLinux 9 is simple because: - -- repositories are open -- reposync can pull repository metadata, erratas, and modules files - automatically. - -!!! info "Use Enterprise Linux 9" - These instructions have been tested to work properly on Enterprise - Linux 9 and Enterprise Linux 8. - -First, let's create the directory where mirroring configuration will reside: -``` -sudo mkdir -p /etc/yum-mirror-config -``` - -Then, let's create configuration file for EuroLinux 9 mirroring -`/etc/yum-mirror-config/mirror_yum_el9.conf` with the contents: - -```ini -[main] -cachedir=/var/cache/yum/mirror/$basearch/$releasever -keepcache=0 -debuglevel=2 -logfile=/var/log/mirror-yum-el9.log -plugins=1 -exactarch=0 -obsoletes=0 -reposdir=/dev/null - -[baseos] -name = EuroLinux BaseOS -baseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/9/$basearch/BaseOS/os -enabled=1 -gpgcheck=1 -gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux9 -skip_if_unavailable=1 - -[appstream] -name = EuroLinux AppStream -baseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/9/$basearch/AppStream/os -enabled=1 -gpgcheck=1 -gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux9 -skip_if_unavailable=1 - -[crb] -name = EuroLinux CRB -baseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/9/$basearch/CRB/os -enabled=1 -gpgcheck=1 -gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux9 -skip_if_unavailable=1 -``` - -Then invoke the command `reposync` with the following arguments: - -``` -reposync --downloadcomps --download-metadata -c /etc/yum-mirror-config/mirror_yum_el9.conf -p /repos -``` - -## Mirroring EuroLinux 8 - -Making a local mirror for EuroLinux 8 and EuroLinux 9 is simple because: - -- repositories are open -- reposync can pull repository metadata, erratas, and modules files - automatically. - -!!! info "Use Enterprise Linux 8" - These instructions have been tested to work properly on Enterprise - Linux 8. While everything may work well, it's not recommended to use - other versions. - -First, let's create the file `/etc/yum-mirror-config/mirror_yum.conf` -with the contents: - -```ini -[main] -cachedir=/var/cache/yum/mirror/$basearch/$releasever -keepcache=0 -debuglevel=2 -logfile=/var/log/mirror-yum.log -plugins=1 -exactarch=0 -obsoletes=0 -reposdir=/dev/null - -[baseos] -name = EuroLinux BaseOS -baseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/BaseOS/os -enabled=1 -gpgcheck=1 -gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8 -skip_if_unavailable=1 - -[appstream] -name = EuroLinux AppStream -baseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/AppStream/os -enabled=1 -gpgcheck=1 -gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8 -skip_if_unavailable=1 - -[powertools] -name = EuroLinux PowerTools -baseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/PowerTools/os -enabled=1 -gpgcheck=1 -gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8 -skip_if_unavailable=1 -``` - -Then invoke the command `reposync` with the following arguments: - -``` -reposync --downloadcomps --download-metadata -c /etc/yum-mirror-config/mirror_yum.conf -p /repos -``` - -## Mirroring EuroLinux 7 - -!!! info "Use Enterprise Linux 7" - These instructions have been tested to work properly on Enterprise - Linux 7. While everything may work well, it's not recommended to use - other versions. - -### The official way - -**EuroLinux 7 is not open-core**; therefore, only organizations with a proper -license (EuroMan or Golden Key) can mirror it freely. - -!!! information "We know" - We are well aware that it is possible to mirror repos even with a single - license. You can read about that below. - -The official way to mirror EuroLinux repositories is the following: - -- You need a proper subscription, like EuroMan or Golden Key -- EuroLinux engineer will provide you with SSL certificates that we will name - `repo.key` and `repo.crt` and CA that we will name `ca.crt` - -Create the directory `/etc/yum-mirror-config/`. -With the repokeys residing in that directory, create the file -`/etc/yum-mirror-config/mirror_yum.conf` with the contents: - -```ini -[main] -cachedir=/var/cache/yum/mirror/$basearch/$releasever -keepcache=0 -debuglevel=2 -logfile=/var/log/mirror-yum.log -exactarch=0 -obsoletes=0 -gpgcheck=0 -plugins=0 -reposdir=/dev/null - -[eurolinux-os-7] -name=el7_x86_64_os -baseurl=https://cdn.euro-linux.com/dist/eurolinux/server/7/x86_64/os/ -sslclientkey=/etc/yum-mirror-config/repo.key -sslclientcrt=/etc/yum-mirror-config/repo.crt -sslcacert=/etc/yum-mirror-config/ca.crt - -[eurolinux-updates-7] -name=el7_x86_64_updates -baseurl=https://cdn.euro-linux.com/dist/eurolinux/server/7/x86_64/updates/ -sslclientkey=/etc/yum-mirror-config/repo.key -sslclientcrt=/etc/yum-mirror-config/repo.crt -sslcacert=/etc/yum-mirror-config/ca.crt -``` - -Then invoke the command `reposync` with the following arguments: - -``` -reposync -d -m --download-metadata -c /etc/yum-mirror-config/mirror_yum.conf -p /repos -``` - -When the download finishes, the next step is to create repodata and enable -groups. - -```bash -cd /repos/eurolinux-os-7/; createrepo . -g comps.xml -cd /repos/eurolinux-updates-7/; createrepo . -g comps.xml -``` - -!!! info Erratas - Enabling updateinfo (erratas information) is a little bit tricky, because - firstly you have to find the newest updateinfo, unpack it, then invoke - modifyrepo script. It can be automated with the script below. - -```bash -REPO_DIR=/repos/eurolinux-os-7/ -unset -v LAST_UI -# finding the newest file -for file in "$REPO_DIR"/*updateinfo.xml.gz; do - [[ "$file" -nt "$LAST_UI" ]] && LAST_UI=$file -done -# unpacking to updateinfo.xml file -sudo gunzip -c "$LAST_UI" > "$REPO_DIR/updateinfo.xml" -# Depending on the system - some has modifrepo.py script some has "normal" command -/usr/share/createrepo/modifyrepo.py "$REPO_DIR/updateinfo.xml" "$REPO_DIR/repodata" || modifyrepo "$REPO_DIR/updateinfo.xml" "$REPO_DIR/repodata" - -REPO_DIR=/repos/eurolinux-updates-7/ -unset -v LAST_UI -for file in "$REPO_DIR"/*updateinfo.xml.gz; do - [[ $file -nt $LAST_UI ]] && LAST_UI=$file -done -sudo gunzip -c "$LAST_UI" > "$REPO_DIR/updateinfo.xml" -# Depending on the system - some has modifrepo.py script some has "normal" command -/usr/share/createrepo/modifyrepo.py "$REPO_DIR/updateinfo.xml" "$REPO_DIR/repodata" || modifyrepo "$REPO_DIR/updateinfo.xml" "$REPO_DIR/repodata" -``` - -### The unsupported way - -There is also the possibility to mirror EuroLinux repositories even with a -single or even test subscription. - -!!! warning "True Product – Real Support – Fair Price" - We are faithful to our values. We also know that it's always possible to - cheat and not play fair. Please be aware that during support inqury, we - might check if your system is registered and supported. To this day, we - always had pleasure to work with honest companies - please don't ruin that. - -!!! danger "Mirroring other distros" - The instruction allows cloning other distros, including paid ones. If you - want to mirror paid Linux distribution, note that this might breach the - license/license agreement. - -You can mirror EuroLinux or other Enterprise Linux repositories with the -following step: - -- Register your system with `rhn_register` command for EuroLinux or another way - to mirror another system repositories. - -Then run the following snippet as root: - -```bash -reposync -d -m --download-metadata --plugins -r el-server-7-x86_64 -p /repos/ -# recreating repodata and updateinfo -REPO_DIR=/repos/el-server-7-x86_64/ -cd /repos/el-server-7-x86_64/; createrepo . -g comps.xml -unset -v LAST_UI -for file in "$REPO_DIR"/*updateinfo.xml.gz; do - [[ $file -nt $LAST_UI ]] && LAST_UI=$file -done -sudo gunzip -c "$LAST_UI" > "$REPO_DIR/updateinfo.xml" -# Depending on the system - some has modifrepo.py script some has "normal" command -/usr/share/createrepo/modifyrepo.py "$REPO_DIR/updateinfo.xml" "$REPO_DIR/repodata" || modifyrepo "$REPO_DIR/updateinfo.xml" "$REPO_DIR/repodata" -``` - -## Mirroring EuroLinux 6 ELS - -First, register your system to EuroLinux EuroMan with the [migration scripts](https://github.com/EuroLinux/eurolinux-migration-scripts/tree/el6-only-switch-repos) - use the `el6-only-switch-repos` branch for this. - -Once the system has been registered and is receiving EL6 ELS updates, you can mirror the ELS packages with the following commands. Run them as root: - -``` -reposync -d -m --download-metadata --plugins -r els-6-x86_64 -p /repos/ -# recreating repodata and updateinfo -REPO_DIR=/repos/els-6-x86_64/ -cd /repos/els-6-x86_64/; createrepo . -g comps.xml -unset -v LAST_UI -for file in "$REPO_DIR"/*updateinfo.xml.gz; do - [[ $file -nt $LAST_UI ]] && LAST_UI=$file -done -sudo gunzip -c "$LAST_UI" > "$REPO_DIR/updateinfo.xml" -# Depending on the system - some has modifrepo.py script some has "normal" command -/usr/share/createrepo/modifyrepo.py "$REPO_DIR/updateinfo.xml" "$REPO_DIR/repodata" || modifyrepo "$REPO_DIR/updateinfo.xml" "$REPO_DIR/repodata" -``` diff --git a/docs/HowTo/vagrant-with-libvirt.md b/docs/HowTo/vagrant-with-libvirt.md deleted file mode 100644 index f97d4bb..0000000 --- a/docs/HowTo/vagrant-with-libvirt.md +++ /dev/null @@ -1,95 +0,0 @@ -# Vagrant with vagrant-libvirt plugin on Enterprise Linux 8 - -## Introduction - -This guide covers the installation of libvirt and related tools along with the -Vagrant plugin that allows using libvirt as a provider. This has been tested on -a clean installation of EuroLinux 8.5 - only Vagrant has been installed already -as described in [Vagrant jumpstart](../jumpstarts/vagrant-jumpstart.md). - -### Terminology - -- **QEMU** - a generic machine emulator -- **KVM** - a virtualisation solution that is native to Linux. Used by QEMU to - achieve near-native performances by executing the guest code directly on - the host CPU -- **libvirt** - a management suite for several hypervisors - -While libvirt can manage many virtualisation solutions, in the context of this -document *libvirt* refers to: *QEMU with KVM managed by libvirt*. - -### Why prefer libvirt over providers such as VirtualBox? - -As mentioned, KVM is a native virtualisation solution to Linux. This means a -[significant performance -boost](https://web.archive.org/web/20210119220104/https://www.phoronix.com/scan.php?page=article&item=virtualbox-60-kvm&num=1) -when compared to other providers at the slight cost of portability - if you run -Linux only, then this is your solution of choice! - -If you have never used libvirt before and just heard about it in this how-to, -there are several goodies worth mentioning. As an example unrelated to Vagrant: -Virt-Manager allows you to get a similar GUI experience out of KVM as that of -e.g. VirtualBox, it is fully Free Software (no worrying about licensing -shenanigans) and is more modular - in fact, there is a [libvirt VirtualBox -driver](https://libvirt.org/drvvbox.html) out there. - -## Install the plugin - -Normally one would invoke a single command: `vagrant plugin install -vagrant-libvirt` and the plugin would work well out-of-the-box. This is not the -case for Linux distributions from the Enterprise Linux family and [Upstream is -aware of that](https://github.com/hashicorp/vagrant/issues/11020), but as of -today (2021.12.21) it doesn't appear to be resolved. - -Because of that, you'll need to build additional components and use them with -your Vagrant installation. The following procedure covers all of this and has -been tested to work well with EuroLinux 8.5. - -Use these commands: - -``` -[ "$(command -v vagrant)" ] || \ -( read -p "Install Vagrant first before running the following commands" \ - && exit 1 ) - -sudo dnf groupinstall "Development Tools" "Virtualization Host" -y -sudo dnf install cmake libvirt-devel ruby-devel -y - -mkdir krb5 -cd krb5 -wget https://vault.cdn.euro-linux.com/sources/eurolinux/8/baseos/x86_64/Packages/k/krb5-1.18.2-8.el8.src.rpm -rpm2cpio krb5*.src.rpm | cpio -idmv -tar xf krb5*.tar.gz -cd krb5*/src -./configure -make -sudo cp -P lib/crypto/libk5crypto.* /opt/vagrant/embedded/lib64/ -cd - -mkdir libssh -cd libssh -wget https://vault.cdn.euro-linux.com/sources/eurolinux/8/baseos/x86_64/Packages/l/libssh-0.9.4-3.el8.src.rpm -rpm2cpio libssh*.src.rpm | cpio -idmv -tar xf libssh*.tar.xz -mkdir build -cd build -cmake ../libssh-*/ -DOPENSSL_ROOT_DIR=/opt/vagrant/embedded/ -make -sudo cp lib/libssh* /opt/vagrant/embedded/lib64 -cd - -vagrant plugin install vagrant-libvirt && rm -rf krb5 libssh -sudo usermod -a -G libvirt $USER -``` - -Next, log out from all of your sessions (graphical and text) and log in again. -From now on you should be able to run Vagrant boxes with libvirt if all -requirements have been satisfied, e.g. you don't have any other providers -enabled (an equivalent of deploying this guide on a clean installation). - -## Additional resources - -- The [plugin's repository](https://github.com/vagrant-libvirt/vagrant-libvirt) -- Websites of provider-related projects: [KVM](http://linux-kvm.org/), - [libvirt](http://libvirt.org/), [QEMU](http://qemu.org), - [Virt-Manager](http://virt-manager.org/) diff --git a/docs/HowTo/virtualbox.md b/docs/HowTo/virtualbox.md deleted file mode 100644 index 66b584e..0000000 --- a/docs/HowTo/virtualbox.md +++ /dev/null @@ -1,129 +0,0 @@ -# VirtualBox - -How to set up your VirtualBox installation. - -## Introduction - -### Use cases - -Consider the following examples: - -- You use software that doesn't work on your EuroLinux 8 installation. -- You want to try out some potentially dangerous actions and don't want to - endanger your machine. -- You develop some awesome software and want to test it on several systems for - compatibility -- You want an easily reproducible environment that works the same way on every - person's machine -- You need a multi-machine laboratory, maybe with several different systems and - don't have the resources for a physical equipment - -### Why use it over other virtualisation providers? - -VirtualBox is the provider with a copyleft license and a focus on -interoperability when it comes to supporting different platforms. This allows -you to cooperate with someone running a different operating system and when -exchanging documentation - once written it's applicable to anyone that can run -the software. -New VirtualBox versions usually support older operating systems too. One can -enjoy the new features on a system, which has recently reached its End of Life, -which can be indispensable for a company that can't migrate yet. - -## System requirements - -A brief documentation is available at -[Upstream's](https://www.virtualbox.org/wiki/End-user_documentation). - -Your machine shall support hardware virtualisation. If it doesn't, you either -need to perform additional troubleshooting - e.g. enable virtualisation in your -machine's BIOS settings. - -``` -[ $(grep -cE 'vmx|svm' /proc/cpuinfo) -gt 0 ] && echo "OK" -``` - -Make sure you're running EuroLinux 8 on x86_64 architecture rather than ARM. - -``` -[ "$(arch)" == "x86_64" ] && echo "OK" -``` - -## Installation on EuroLinux 8 - -As of today (2 September 2021), 6.1 is the main VirtualBox branch and this is -the one we install in this guide. -Assuming your account has been made an administrator during the system -installation process, simply run these commands for an installation: - -``` -sudo dnf groupinstall "Development Tools" -y -sudo dnf config-manager \ - --add-repo=https://download.virtualbox.org/virtualbox/rpm/el/virtualbox.repo -sudo dnf install VirtualBox-6.1 -y -``` - -VirtualBox should be ready to use! - -### USB devices - -If you want VirtualBox to support USB devices for your system account, run -this command as well: - -``` -sudo usermod -a -G vboxusers $USER -``` - -then log out of your graphical session and log in again. - -### Extension Pack - -VirtualBox doesn't support certain technologies out-of-the-box, e.g. USB -2.0/3.0 or builtin disk encryption, among others. If you want them to be -supported, you will need VirtualBox Extension Pack. Make sure you have read -[its license](https://www.virtualbox.org/wiki/VirtualBox_PUEL) and understand -its implications - you're responsible for compliance. -You may want to read [Upstream's -FAQ](https://www.virtualbox.org/wiki/Licensing_FAQ) for a quick start. - -Once you're sure you'll be able to comply with the licensing terms, run these -commands to install the Extension Pack: - -``` -export vbox_version="$(VBoxManage --version | cut -d'r' -f 1)" -wget "https://download.virtualbox.org/virtualbox/$vbox_version/Oracle_VM_VirtualBox_Extension_Pack-$vbox_version.vbox-extpack" -yes | sudo VBoxManage extpack install --replace Oracle_VM_VirtualBox_Extension_Pack-$vbox_version.vbox-extpack -``` - -## Troubleshooting - -### I can't enable hardware virtualisation and prefer software emulation - -As [Upstream -says](https://web.archive.org/web/20210830005115/https://www.virtualbox.org/wiki/Downloads), -for software mode you'll need VirtualBox branch 6.0 or older. -> Please also use version 6.0 if you need to run VMs with software -> virtualization, as this has been discontinued in 6.1. - -## Additional resources - -### Upstream's release pages - -If you prefer a manual download, check out [Upstream's Linux release -pages](https://www.virtualbox.org/wiki/Linux_Downloads) and use the one they -provide for RHEL 8. - -### RPM Fusion - -Alternatively you can use [RPM Fusion](https://rpmfusion.org/) repository for -installation. The software might differ in branding a bit and only the latest -release is provided. Use these commands: - -``` -sudo dnf localinstall \ - https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -y -sudo dnf localinstall --nogpgcheck \ - https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm -y -sudo dnf install VirtualBox -y -sudo akmods --kernels $(uname -r) && sudo systemctl restart vboxdrv.service -``` - diff --git a/docs/HowTo/z-documentation-markdown.md b/docs/HowTo/z-documentation-markdown.md deleted file mode 100644 index 77aba01..0000000 --- a/docs/HowTo/z-documentation-markdown.md +++ /dev/null @@ -1,140 +0,0 @@ -# Quick markdown and extensions guide - -The first part of this guide is loosely based on [Adam Pritchard markdown-here -cheatsheet](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet). -We include it here for contributors as reference and show how different pieces -will be styled. If you are familiar with markdown, and want to skip to this -project specific extensions they start with [Admonition](#admonition): - -### Headers -Headers are created with `#`. -``` -# H1 This is is reserved for page title/name -## H2 [Contribution guide] is h2 -### H3 [Headers] is h3 -... -###### H6 -``` -#### This is fourth header -##### This is fifth header -###### This is sixth header - -**Headers are essentials, because table of content is based on them.** - -### Emphasis -``` -Emphasis, aka italics, with *asterisks* or _underscores_. - -Strong emphasis, aka bold, with **asterisks** or __underscores__. - -Combined emphasis with **asterisks and _underscores_**. - -Strikethrough uses two tildes. ~~Scratch this.~~ -``` -Emphasis, aka italics, with *asterisks* or _underscores_. - -Strong emphasis, aka bold, with **asterisks** or __underscores__. - -Combined emphasis with **asterisks and _underscores_**. - -Strikethrough uses two tildes. ~~Scratch this.~~ - -### List - -!!! warning "Proper markdown required" - MK-Docs has proper markdown list ordering that is 1 to 1 with markdown standard. - - See: [Python Markdown Issue 3](https://github.com/Python-Markdown/markdown/issues/3) - - **TLDR: You have indent sub-list and paragraps with 4 spaces** - -(In this example, leading and trailing spaces are shown with with dots: ⋅) -``` -1. First ordered list item -2. Another item -⋅⋅⋅⋅* Unordered sub-list. -1. Actual numbers don't matter, just that it's a number -⋅⋅⋅⋅1. Ordered sub-list -4. And another item. - -⋅⋅⋅⋅To create paragraph within list item you need newline and four leading spaces. To have a line⋅⋅ -⋅⋅⋅⋅break without a paragraph, you will need to use two trailing spaces. - -!!! info Python markdown quirk - Python-Markdown won't reset list without paragraph. Even if list types are - not compatybile (ordered vs unordered) - -* Unordered list can use asterisks -- Or minuses -+ Or pluses -``` - -1. First ordered list item -2. Another item - * Unordered sub-list. -1. Actual numbers don't matter, just that it's a number - 1. Ordered sub-list -4. And another item. - - To create paragraph within list item you need newline and four leading spaces. To have a line - break without a paragraph, you use two trailing spaces. - -!!! info "Python markdown quirk" - Python-Markdown won't reset list without paragraph. Even if list types are - not compatybile (ordered vs unordered) - -* Unordered list can use asterisks -- Or minuses -+ Or pluses - -### Code blocks - -To add code block use (without leading space) -``` - ```python - # nice - for i in range(69, 420): - print(i) - ``` -``` - -Example: -```python -# nice -for i in range(69, 420): - print(i) -``` - -### Admonition - -!!! info - This is admontion extension for markdown. It support things like - (info,todo), (warning,caution,attention), (danger,error) and more. - -Code in markdown: - -``` -!!! info - This is admontion extension for markdown. It support things like - (info,todo), (warning,caution,attention), (danger,error) and more. -``` -!!! warning "For more information check documentation" - Check [mkdocs-material docs](https://squidfunk.github.io/mkdocs-material/reference/admonitions/) - -Code in markdown: -``` -!!! warning "For more information check documentation" - Check [mkdocs-material docs](https://squidfunk.github.io/mkdocs-material/reference/admonitions/) -``` - -### Keyboard Keys - -Sometimes you might add keys combinations. For example: - - -To use second TY terminal use following key combination ++ctrl+alt+f2++ - -To make them visible in nice way you should use following syntax: -``` -To use second TY terminal use following key combination ++ctrl+alt+f2++ -``` diff --git a/docs/assets/8-jumpstart/additional-repos.png b/docs/assets/8-jumpstart/additional-repos.png deleted file mode 100644 index 256ad56..0000000 Binary files a/docs/assets/8-jumpstart/additional-repos.png and /dev/null differ diff --git a/docs/assets/8-jumpstart/g-inst-1.png b/docs/assets/8-jumpstart/g-inst-1.png deleted file mode 100644 index 9ef1bee..0000000 Binary files a/docs/assets/8-jumpstart/g-inst-1.png and /dev/null differ diff --git a/docs/assets/8-jumpstart/g-inst-2.png b/docs/assets/8-jumpstart/g-inst-2.png deleted file mode 100644 index eb6a9ce..0000000 Binary files a/docs/assets/8-jumpstart/g-inst-2.png and /dev/null differ diff --git a/docs/assets/8-jumpstart/g-inst-3.png b/docs/assets/8-jumpstart/g-inst-3.png deleted file mode 100644 index 7992865..0000000 Binary files a/docs/assets/8-jumpstart/g-inst-3.png and /dev/null differ diff --git a/docs/assets/8-jumpstart/g-inst-4.png b/docs/assets/8-jumpstart/g-inst-4.png deleted file mode 100644 index 561a20f..0000000 Binary files a/docs/assets/8-jumpstart/g-inst-4.png and /dev/null differ diff --git a/docs/assets/8-jumpstart/g-inst-5.png b/docs/assets/8-jumpstart/g-inst-5.png deleted file mode 100644 index 07b45ad..0000000 Binary files a/docs/assets/8-jumpstart/g-inst-5.png and /dev/null differ diff --git a/docs/assets/8-jumpstart/text-inst-1.png b/docs/assets/8-jumpstart/text-inst-1.png deleted file mode 100644 index 5bc6d49..0000000 Binary files a/docs/assets/8-jumpstart/text-inst-1.png and /dev/null differ diff --git a/docs/assets/8-jumpstart/text-inst-2.png b/docs/assets/8-jumpstart/text-inst-2.png deleted file mode 100644 index 5261793..0000000 Binary files a/docs/assets/8-jumpstart/text-inst-2.png and /dev/null differ diff --git a/docs/assets/8-jumpstart/text-inst-3.png b/docs/assets/8-jumpstart/text-inst-3.png deleted file mode 100644 index e3385e0..0000000 Binary files a/docs/assets/8-jumpstart/text-inst-3.png and /dev/null differ diff --git a/docs/assets/9-beta-jumpstart/additional-repos.png b/docs/assets/9-beta-jumpstart/additional-repos.png deleted file mode 100644 index 9f1ec12..0000000 Binary files a/docs/assets/9-beta-jumpstart/additional-repos.png and /dev/null differ diff --git a/docs/assets/9-beta-jumpstart/g-inst-1.png b/docs/assets/9-beta-jumpstart/g-inst-1.png deleted file mode 100644 index ca12888..0000000 Binary files a/docs/assets/9-beta-jumpstart/g-inst-1.png and /dev/null differ diff --git a/docs/assets/9-beta-jumpstart/g-inst-2.png b/docs/assets/9-beta-jumpstart/g-inst-2.png deleted file mode 100644 index 7834779..0000000 Binary files a/docs/assets/9-beta-jumpstart/g-inst-2.png and /dev/null differ diff --git a/docs/assets/9-beta-jumpstart/g-inst-3.png b/docs/assets/9-beta-jumpstart/g-inst-3.png deleted file mode 100644 index 16c08cc..0000000 Binary files a/docs/assets/9-beta-jumpstart/g-inst-3.png and /dev/null differ diff --git a/docs/assets/9-beta-jumpstart/g-inst-4.png b/docs/assets/9-beta-jumpstart/g-inst-4.png deleted file mode 100644 index b1cc4ed..0000000 Binary files a/docs/assets/9-beta-jumpstart/g-inst-4.png and /dev/null differ diff --git a/docs/assets/9-beta-jumpstart/g-inst-5.png b/docs/assets/9-beta-jumpstart/g-inst-5.png deleted file mode 100644 index 85d92ca..0000000 Binary files a/docs/assets/9-beta-jumpstart/g-inst-5.png and /dev/null differ diff --git a/docs/assets/9-beta-jumpstart/pre-release-software.png b/docs/assets/9-beta-jumpstart/pre-release-software.png deleted file mode 100644 index 14d5895..0000000 Binary files a/docs/assets/9-beta-jumpstart/pre-release-software.png and /dev/null differ diff --git a/docs/assets/9-beta-jumpstart/text-inst-1.png b/docs/assets/9-beta-jumpstart/text-inst-1.png deleted file mode 100644 index c9c0b61..0000000 Binary files a/docs/assets/9-beta-jumpstart/text-inst-1.png and /dev/null differ diff --git a/docs/assets/9-beta-jumpstart/text-inst-2.png b/docs/assets/9-beta-jumpstart/text-inst-2.png deleted file mode 100644 index 7b6a407..0000000 Binary files a/docs/assets/9-beta-jumpstart/text-inst-2.png and /dev/null differ diff --git a/docs/assets/9-beta-jumpstart/text-inst-3.png b/docs/assets/9-beta-jumpstart/text-inst-3.png deleted file mode 100644 index 045f700..0000000 Binary files a/docs/assets/9-beta-jumpstart/text-inst-3.png and /dev/null differ diff --git a/docs/assets/9-beta-jumpstart/text-inst-vnc-prompt.png b/docs/assets/9-beta-jumpstart/text-inst-vnc-prompt.png deleted file mode 100644 index dcb2c4d..0000000 Binary files a/docs/assets/9-beta-jumpstart/text-inst-vnc-prompt.png and /dev/null differ diff --git a/docs/assets/9-jumpstart/additional-repos.png b/docs/assets/9-jumpstart/additional-repos.png deleted file mode 100644 index b8814c0..0000000 Binary files a/docs/assets/9-jumpstart/additional-repos.png and /dev/null differ diff --git a/docs/assets/9-jumpstart/g-inst-1.png b/docs/assets/9-jumpstart/g-inst-1.png deleted file mode 100644 index ca12888..0000000 Binary files a/docs/assets/9-jumpstart/g-inst-1.png and /dev/null differ diff --git a/docs/assets/9-jumpstart/g-inst-2.png b/docs/assets/9-jumpstart/g-inst-2.png deleted file mode 100644 index a644d24..0000000 Binary files a/docs/assets/9-jumpstart/g-inst-2.png and /dev/null differ diff --git a/docs/assets/9-jumpstart/g-inst-3.png b/docs/assets/9-jumpstart/g-inst-3.png deleted file mode 100644 index 6593c74..0000000 Binary files a/docs/assets/9-jumpstart/g-inst-3.png and /dev/null differ diff --git a/docs/assets/9-jumpstart/g-inst-4.png b/docs/assets/9-jumpstart/g-inst-4.png deleted file mode 100644 index d8afdb3..0000000 Binary files a/docs/assets/9-jumpstart/g-inst-4.png and /dev/null differ diff --git a/docs/assets/9-jumpstart/g-inst-5.png b/docs/assets/9-jumpstart/g-inst-5.png deleted file mode 100644 index 984be8c..0000000 Binary files a/docs/assets/9-jumpstart/g-inst-5.png and /dev/null differ diff --git a/docs/assets/9-jumpstart/text-inst-1.png b/docs/assets/9-jumpstart/text-inst-1.png deleted file mode 100644 index 915666b..0000000 Binary files a/docs/assets/9-jumpstart/text-inst-1.png and /dev/null differ diff --git a/docs/assets/9-jumpstart/text-inst-2.png b/docs/assets/9-jumpstart/text-inst-2.png deleted file mode 100644 index 7a2d734..0000000 Binary files a/docs/assets/9-jumpstart/text-inst-2.png and /dev/null differ diff --git a/docs/assets/9-jumpstart/text-inst-3.png b/docs/assets/9-jumpstart/text-inst-3.png deleted file mode 100644 index 045f700..0000000 Binary files a/docs/assets/9-jumpstart/text-inst-3.png and /dev/null differ diff --git a/docs/assets/9-jumpstart/text-inst-vnc-prompt.png b/docs/assets/9-jumpstart/text-inst-vnc-prompt.png deleted file mode 100644 index 9837c6b..0000000 Binary files a/docs/assets/9-jumpstart/text-inst-vnc-prompt.png and /dev/null differ diff --git a/docs/assets/el-logo.png b/docs/assets/el-logo.png deleted file mode 100644 index d33b71b..0000000 Binary files a/docs/assets/el-logo.png and /dev/null differ diff --git a/docs/assets/favicon-white.png b/docs/assets/favicon-white.png deleted file mode 100644 index 0afbacb..0000000 Binary files a/docs/assets/favicon-white.png and /dev/null differ diff --git a/docs/assets/favicon.png b/docs/assets/favicon.png deleted file mode 100644 index 24bfbbe..0000000 Binary files a/docs/assets/favicon.png and /dev/null differ diff --git a/docs/assets/wrong-efi/reinstall.png b/docs/assets/wrong-efi/reinstall.png deleted file mode 100644 index bfcb207..0000000 Binary files a/docs/assets/wrong-efi/reinstall.png and /dev/null differ diff --git a/docs/assets/wrong-efi/rescue-tux-1.png b/docs/assets/wrong-efi/rescue-tux-1.png deleted file mode 100644 index 47e7dc9..0000000 Binary files a/docs/assets/wrong-efi/rescue-tux-1.png and /dev/null differ diff --git a/docs/assets/wrong-efi/rescue-tux-2.png b/docs/assets/wrong-efi/rescue-tux-2.png deleted file mode 100644 index 7736e63..0000000 Binary files a/docs/assets/wrong-efi/rescue-tux-2.png and /dev/null differ diff --git a/docs/assets/wrong-efi/wrong-efi-screen.png b/docs/assets/wrong-efi/wrong-efi-screen.png deleted file mode 100644 index c47da9c..0000000 Binary files a/docs/assets/wrong-efi/wrong-efi-screen.png and /dev/null differ diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index b5e671e..0000000 --- a/docs/index.md +++ /dev/null @@ -1,133 +0,0 @@ -# EuroLinux - - -## About Documentation -This is EuroLinux community-driven documentation. - -**We welcome your contributions to EuroLinux!** - -You can: - -- star the repository to show your support -- contribute via a Pull Request - see [How to contribute](#how-to-contribute) -- create requests for a particular topic via [Issue Creation on - GitHub](https://github.com/EuroLinux/eurolinux-open-docs/issues/new/choose) - - - -!!! info additional documentation - As EuroLinux is in Open Core model there are also additional documentation - for our customer that are available at [EuroLinux Support - Portal](https://support.euro-linux.com). - - -!!! info EuroLinux man Pages - You can find our online Enterprise Linux Man pages server here - [https://man.docs.euro-linux.com](https://man.docs.euro-linux.com). - - -## How documentation is organized? - -Documentation is organized in the following manner: - -- JumpStarts - Installation guides with extras -- HowTo - How To guides on various topics -- Release Notes - -## How to contribute - -We love your input! We value transparent and easy to contribute projects, that's -why we choose GitHub. You can contribute to this project with: - -- Proposing a new topic that should be described -- Discussing the current state of the docs -- Reporting a bug -- Submitting a fix - -**We Use GitHub with GitHub Flow. All changes are made through pull requests.** - -Pull requests are the best and well-established way to propose changes. The -GitHub Flow that allows us to provide reviews and discussion about documentation/code -is described in detail [here](https://docs.github.com/en/get-started/quickstart/github-flow). - -Use our specially crafted issue templates: [EuroLinux Open Docs issue from a -template](https://github.com/EuroLinux/eurolinux-open-docs/issues/new/choose) to -contribute a topic you would like to see. - -If you want to contribute with code (we keep documentation as code), do the -following: - -1. Fork the repository and create your own branch from master. -2. It would be great if you could test your changes with mkdocs (described in - detail in [Setup environment locally](#setup-environment-locally)) -3. Write/Apply your changes and commit to your branch. -4. Create a pull request! - -### GitHub Labs - -If you are new to Git VCS (Version Control System) or GitHub, you can visit -[GitHub Learning Lab](https://lab.github.com/), especially [First Day on GitHub -course](https://lab.github.com/githubtraining/first-day-on-github). GitHub -courses are free, interactive and put stress on practical aspects. - -## Tools -We are using `mkdocs` with `mkdocs-material` to build and style our -documentation. - -- [MkDocs site](https://mkdocs.readthedocs.io/en/stable/) -- [Material for MkDocs site](https://squidfunk.github.io/mkdocs-material/) - - -## Setup environment locally - -Because MkDocs is Python based, you need at least these installed to run this -documentation locally: - -- python3 (3.6+) -- pip -- virtualenv - -First, let's create a virtualenv, so you don't bloat your system-wide python -environment: -``` -virtualenv -p /usr/bin/python3 venv -``` - -Then activate virtualenv - -Bash: -```bash -. venv/bin/activate -``` - -Fish: -```fish -. venv/bin/activate.fish -``` - -Now you are ready to install MkDocs and other Python packages: -``` -pip install -r requirements.txt -``` - -After it serving documentation on your host is as easy as running: -``` -mkdocs serve -``` - -To build documentation invoke: -``` -mkdocs build -``` - -It will build documentation and save it into `site` directory - -!!! warning "Please don't include site directory in pull requests" - Because we deploy this documentation with GitHub Pages, the `site` - directory is not gitignored - - -## Markdown cheat sheet for this project -We created simple cheat sheet for MkDocs markdown syntax with extensions -enabled in this project. It can be found -[here](HowTo/z-documentation-markdown.md). diff --git a/docs/jumpstarts/8-jumpstart.md b/docs/jumpstarts/8-jumpstart.md deleted file mode 100644 index 4edf3e4..0000000 --- a/docs/jumpstarts/8-jumpstart.md +++ /dev/null @@ -1,337 +0,0 @@ -# EuroLinux 8 Jump Start - -This document contains the necessary information to set up your first EuroLinux -8 installation. - -## System Requirements - -### x86_64 (64 bit AMD/Intel architecture) - -Minimal and recommended requirements are following: - -| Resource | Absolute minimal requirements for cloud deployment | Minimal | Recommended | -|----------|--------|------|---| -| Logical CPU | 1 | 1 | 1 | -| RAM | 768MB or 512MB with swap space| 1 GB | 1.5 GB per logical CPU | -| Storage | 5 GB (excluding swap)| 10GB | 20GB | - -Logical CPU means Physical CPU (including Hyper-Threading) or vCPU (virtual -CPU). - -!!! warning - It might be impossible to install EuroLinux on a system that does not meet - recommended requirements. - -### aarch64 (64 bit ARM architecture) - -Minimal and recommended requirements are following: - -| Resource | Absolute minimal requirements for cloud deployment | Minimal | Recommended | -|----------|--------|------|---| -| Logical CPU | 1 | 1 | 1 | -| RAM | 1 GB or 512MB with swap space | 2 GB | 2 GB per logical CPU | -| Storage | 5GB | 10GB | 20GB | - -#### About absolute minimums for cloud deployment - -During our internal testing, we were able to boot and use very basic and -already installed services on Virtual Machine with only 256 MB of RAM. However, -without additional memory or at least swap space available, things like -updating the system will result in actions of Kernel Out of Memory (OOM) -Killer. - - -You can try it yourself with [EuroLinux Vagrant -boxes](https://app.vagrantup.com/eurolinux-vagrant) and following Vagrantfile: - -```ruby -Vagrant.configure("2") do |config| - config.vm.box = "eurolinux-vagrant/eurolinux-8" - - # Explicitly disable vbguest because we are using rsync - if Vagrant.has_plugin?("vagrant-vbguest") - config.vbguest.auto_update = false - end - - config.vm.provider "virtualbox" do |vb| - vb.memory = "256" - vb.cpus = 1 - end - config.vm.provider "libvirt" do |vb| - vb.memory = "256" - vb.cpus = 1 - end -end -``` - -It's also possible to install EuroLinux on less than 5 GB of space, but it also -requires extra attention. - -All absolute minimums for cloud deployments described above are not officially -supported by EuroLinux. - -### Secure boot - -At the moment, EuroLinux does not support secure boot. The full secure boot -support is planned at the end of Q1/beginning of Q2 2022. - -## How to install EuroLinux 8 from ISO - -### Where can you obtain ISO? - -We distribute EuroLinux in a responsible open core model. Because of that, you -might download EuroLinux from different sources. The two primary sources are: - -- [https://fbi.cdn.euro-linux.com/isos/](https://fbi.cdn.euro-linux.com/isos/) - open for everyone -- [https://customerportal.euro-linux.com](https://customerportal.euro-linux.com) - for EuroLinux customers - -The only difference is that Customer Portal keeps older versions, when CDN, -that is used for mirroring, keeps only two of the latest ISOs for each version -to save space (single EuroLinux AppStream ISO might take up to 10 GB). - - -If you are running a huge deployment, you might consider setting up your own -mirror and download ISOs from Intranet. - -### How to check ISO integrity - -During download, many things can happen - from a network or sending host -failure to single-bit error. To check if ISO is undamaged, there are two -mechanisms in place. - -* For each EuroLinux ISO there's a file with its checksums and appropriate - digest algorithms. Its name says, which algorithm was used to calculate the -cryptographic digest. For example, you can browse -[https://fbi.cdn.euro-linux.com/isos/](https://fbi.cdn.euro-linux.com/isos/) -and read the `sha1sums.txt` file. - - -When the ISO download is completed, you can invoke the `sha1sum` command on the -ISO file and check if checksums match. - -``` -[Alex@SpaceShipEL8 Downloads]$ sha1sum EL-8.3-x86_64-20210624-appstream.iso -6a8abaaebe288553ec8568bd9de3f5fda5f1ddb5 EL-8.3-x86_64-20210624-appstream.iso -``` - -* The second mechanism for checking ISO integrity is built-in inside the - installer itself. When you start the installation, use the `Test this media & - install EuroLinux 8` entry: - -![Installation 1](../assets/8-jumpstart/g-inst-1.png) - -After booting up, the ISO checking process will start. - -![Installation 2](../assets/8-jumpstart/g-inst-2.png) - -### Installation with GUI - -Because even a minimal installation uses a GUI the whole process is simple and -straightforward. EuroLinux 8, as well as previous versions, uses Anaconda -installer that clearly informs the user what needs to be done in order to -install the system. - -First, you have to choose the language that will be used during installation: -![Installation 3](../assets/8-jumpstart/g-inst-3.png) - -After configuring the installer language you should see a menu similar to: - -![Installation 2](../assets/8-jumpstart/g-inst-4.png) - -#### Anaconda installer **LOCALIZATION** section: - -- **Keyboard** - this section allows you to setup keyboard layouts, including - the default keyboard layout, additional layouts and key combination to switch - between them. -- **Language support** - additional languages packages that should be - installed. -- **Time & Date** - configure the date, time zone, enable NTP and NTP servers. - -#### Anaconda installer **SOFTWARE** section: - -##### Configuring source of the installation - -Here you might configure the source of your installation. By default, the -system installs from the ISO image itself. **This is one of the officially -supported ways to install EuroLinux**. - -If you enable a NIC (Network Interface Card) in the **Network** installer -section, you might add additional EuroLinux repositories and/or other -repositories. If you add EuroLinux repositories, the installer will -automatically download newer version of the packages. - -!!! info "'certify-' prefix" - Since EuroLinux 8.6 the 'certify-' prefixes in repo URLs and names are no - longer used. These names and URLs were used before we started distributing - our system in the open core model. These URLs are and will be kept as the - symbolic link for backward compatibility. They can be used in some older - parts of the documentation. - - -EuroLinux 8 repositories: - -- URL: `https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/BaseOS/os` - Name: BaseOSProd -- URL: `https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/AppStream/os` - Name: AppStreamProd -- URL: `https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/PowerTools/os` - Name: PowerToolsProd - -For EuroLinux 8 beta: - -- URL: `https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/beta-BaseOS/os` - Name: BaseOSBeta -- URL: `https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/beta-AppStream/os` - Name: AppStreamBeta -- URL: `https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/beta-PowerTools/os` - Name: PowerToolsBeta - -!!! Warning "Limited support." - **Hybrid network installation from both ISO and public repositories - is not our primary goal in the QA process**. Packages in EuroLinux - repositories are regularly updated, and it might be impossible to - install a system from an external source. Depending on the state of the - upstream, we might not fix a potential issue. - -Below you can see an example configuration that was used to install a system: - -![Adding additional repositories](../assets/8-jumpstart/additional-repos.png) - -After changing the installation source, you will have to confirm **Software -Selection**. - -##### Software Selection - -Software Selection allows you to customize which packages will be installed. -You might choose from base environment groups like *Server with GUI*, -*Workstation* or *Minimal*. You can also install additional package groups. - -![Software selection section](../assets/8-jumpstart/g-inst-5.png) - -#### Anaconda installer **SYSTEM** section: - -- **Installation selection** allows choosing on which disk the system will be - installed. If you want to have a fully encrypted system, you should enable - encryption in this step. -- **KDUMP** allows choosing if KDUMP (Kernel crash dump collection mechanism) - should be enabled. -- **Network & Hostname** - you can configure your system networking here -- **Security policy** - you can setup an additional openscap policy here - -#### Anaconda installer **USER SETTINGS** section: - -- **Root Password** - by default, the root user is disabled. If a user is - created in **User Creation** section, the root account can stay disabled -- **User Creation** section allows creating a regular user in the system. If - the *Make this user administrator* option is checked, the root account can be - disabled. - -**After applying all the necessary changes**, the installation can be started -with the "Begin Installation" button. - - -### Disk partition recommended minimums - -You need at least the following partitions. - -- `/boot` for Linux kernel and init ramdisks - 1GB -- `/` (root partition) - at least 10 GB (a very minimal system might use as - little as 2GB - but it requires extra attention and is not officially - supported by EuroLinux) - -For UEFI, an EFI system partition is also required. - -- `/boot/efi` - at least 100MB - -If your storage allows it, the following partitions are also highly -recommended: - -- `swap` - 1GB or more depending on the system RAM and workload. Swap is also - required for hibernation. Depending on the workload of the system, it should - be at least as spacious as system RAM. -- `/home` - at least 1GB - but in most cases, if `/` can be as big as 80GB, - then `/home/` usually takes the rest of the free space - -### Installing EuroLinux in basic graphic mode - -Suppose there is a problem loading/running your graphics card driver (it might -results in a black screen/error message or graphical artifacts). It's possible -to install EuroLinux in basic graphics mode. - -To do so, choose `Troubleshooting` on the welcome menu, and then *Install -EuroLinux 8 in basic graphics mode*. - -From this point the process is identical to a standard installation with GUI. - -### Installing EuroLinux in text mode - -To install EuroLinux in text mode: - -- Boot EuroLinux ISO -- Press ++esc++ to stop installation options selection timeout -- Press ++tab++ -- Add `inst.text` to the end of the kernel boot command line -- Press ++enter++ - -![Text Install 1](../assets/8-jumpstart/text-inst-1.png) - -Before running the installation you have to provide all the necessary -information (represented as `!` in selection). It's a good idea to refresh the -menu with ++r+enter++ command shortly after the installer started. - -![Text Install 2](../assets/8-jumpstart/text-inst-2.png) - -After customization you are ready to start your installation. - -![Text Install 3](../assets/8-jumpstart/text-inst-3.png) - -### Other possibilities - -EuroLinux can also be installed in the following manner: - -- Automated installation with a kickstart file. -- Installation with PXE -- Installation via VNC - -Please consult upstream documentation about these topics. - -## Using EuroLinux - -From this point, you can use EuroLinux as any other RHEL™ based distribution. - -### Submitting a Request for Change - -We truly care. If there is something that you believe could/should be -changed/improved in the EuroLinux distribution and does not break compatibility -with the upstream project, then drop us the issue on GitHub! All contributors -are extremely welcome. - -[EuroLinux Distro Bugs and -RFC](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc/) - -### Submitting a Bug report - -We decided that submitting bug reports should not involve -registration into some nasty miserable software. At the very same -time, we know that most open-source developers have GitHub profiles. -This choice makes the decision making and work as transparent as -possible. That's why we decided to use it as the primary way to -submit bugs. - -[EuroLinux Distro Bugs and -RFC](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc/) - -This repository allows you to stay in **direct contact** with EuroLinux -developers. - -#### Other ways to submit a bug report - -- `support AT euro-linux dot com` -- [EuroLinux Support Portal (subscription - required)](https://support.euro-linux.com) - -#### Security/confidential bug report - -Please use the e-mail provided above. diff --git a/docs/jumpstarts/9-beta-jumpstart.md b/docs/jumpstarts/9-beta-jumpstart.md deleted file mode 100644 index 5855194..0000000 --- a/docs/jumpstarts/9-beta-jumpstart.md +++ /dev/null @@ -1,331 +0,0 @@ -# EuroLinux 9 Beta Jump Start - -This document contains the necessary information to set up your first EuroLinux -9 Beta installation. - -## System Requirements - -### x86_64 (64 bit AMD/Intel architecture) - -Minimal and recommended requirements are following: - -| Resource | Absolute minimal requirements for cloud deployment | Minimal | Recommended | -|----------|--------|------|---| -| Logical CPU | 1 | 1 | 1 | -| RAM | 1 GiB or 768 MiB with swap space| 2 GiB | 1.5 GiB per logical CPU | -| Storage | 5 GB (excluding swap)| 10GB | 20GB | - -Logical CPU means Physical CPU (including Hyper-Threading) or vCPU (virtual -CPU). - -!!! warning - It might be impossible to install EuroLinux on a system that does not meet - recommended requirements. - -#### About absolute minimums for cloud deployment - -During our internal testing, we were able to boot and use very basic and -already installed services on Virtual Machine with only 340 MiB of RAM. -However, without additional memory or at least swap space available, things -like updating the system will result in actions of Kernel Out of Memory (OOM) -Killer. - - -You can try it yourself with [EuroLinux Vagrant -boxes](https://app.vagrantup.com/eurolinux-vagrant) and the following -Vagrantfile: - -```ruby -Vagrant.configure("2") do |config| - config.vm.box = "eurolinux-vagrant/eurolinux-9" - - # Explicitly disable vbguest because we are using rsync - if Vagrant.has_plugin?("vagrant-vbguest") - config.vbguest.auto_update = false - end - - config.vm.provider "virtualbox" do |vb| - vb.memory = "340" - vb.cpus = 1 - end - config.vm.provider "libvirt" do |vb| - vb.memory = "340" - vb.cpus = 1 - end -end -``` - -It's also possible to install EuroLinux on less than 5 GB of space, but it also -requires extra attention. - -All absolute minimums for cloud deployments described above are not officially -supported by EuroLinux. - -### Secure boot - -Since EuroLinux 9 Beta is a pre-release version and not ready for production -use, Secure Boot support has not been implemented. - -## How to install EuroLinux 9 Beta from ISO - -### Where can you obtain ISO? - -We distribute EuroLinux in a responsible open core model. Because of that, you -might download EuroLinux from different sources. The two primary sources are: - -- [https://fbi.cdn.euro-linux.com/isos/](https://fbi.cdn.euro-linux.com/isos/) - open for everyone -- [https://customerportal.euro-linux.com](https://customerportal.euro-linux.com) - for EuroLinux customers - -The only difference is that Customer Portal keeps older versions, when CDN, -that is used for mirroring, keeps only two of the latest ISOs for each version -to save space (single EuroLinux BaseOS ISO might take up to 8 GB). - - -If you are running a huge deployment, you might consider setting up your own -mirror and download ISOs from Intranet. - -### How to check ISO integrity - -During download, many things can happen - from a network or sending host -failure to single-bit error. To check if ISO is undamaged, there are two -mechanisms in place. - -* For each EuroLinux ISO there's a file with its checksums and appropriate - digest algorithms. Its name says, which algorithm was used to calculate the -cryptographic digest. For example, you can browse -[https://fbi.cdn.euro-linux.com/isos/](https://fbi.cdn.euro-linux.com/isos/) -and read the `sha1sums.txt` file. - - -When the ISO download is completed, you can invoke the `sha1sum` command on the -ISO file and check if checksums match. - -``` -$ sha1sum EL-9.0-x86_64-20220225-minimal.iso -73d39d443e27414085f7107fa21dd214d28b8730 EL-9.0-x86_64-20220225-minimal.iso -``` - -* The second mechanism for checking ISO integrity is built-in inside the - installer itself. When you start the installation, use the `Test this media & - install EuroLinux 9` entry: - -![Installation 1](../assets/9-beta-jumpstart/g-inst-1.png) - -After booting up, the ISO checking process will start. - -![Installation 2](../assets/9-beta-jumpstart/g-inst-2.png) - -### Installation with GUI - -Because even a minimal installation uses a GUI the whole process is simple and -straightforward. EuroLinux 9, as well as previous versions, uses Anaconda -installer that clearly informs the user what needs to be done in order to -install the system. - -First, you have to choose the language that will be used during installation: -*Hint: since the Anaconda installer on EuroLinux 9 activates a network -connection automatically if applicable, it also determines the default language -by the automatic location detection feature - in this case you can see that -Polish has been automatically chosen.* -![Installation 3](../assets/9-beta-jumpstart/g-inst-3.png) - -Since this is a Beta release, we might need to confirm that we are aware of -this fact and that this release should not be used in production. - -![Pre-release software](../assets/9-beta-jumpstart/pre-release-software.png) - -After configuring the installer language you should see a menu similar to: - -![Installation 2](../assets/9-beta-jumpstart/g-inst-4.png) - -#### Anaconda installer **LOCALIZATION** section: - -- **Keyboard** - this section allows you to setup keyboard layouts, including - the default keyboard layout, additional layouts and key combination to switch - between them. -- **Language support** - additional languages packages that should be - installed. -- **Time & Date** - configure the date, time zone, enable NTP and NTP servers. - -#### Anaconda installer **SOFTWARE** section: - -##### Configuring source of the installation - -Here you might configure the source of your installation. By default, the -system installs from the ISO image itself. **This is one of the officially -supported ways to install EuroLinux**. - -If a NIC (Network Interface Card) has been enabled in the **Network & Host -Name** installer section, you might add additional EuroLinux repositories -and/or other repositories. If you add EuroLinux repositories, the installer -will automatically download newer version of the packages. - -EuroLinux 9 Beta repositories: - -- URL: `https://fbi.cdn.euro-linux.com/dist/eurolinux/server/9/$basearch/certify-beta-BaseOS/os` - Name: BaseOS -- URL: `https://fbi.cdn.euro-linux.com/dist/eurolinux/server/9/$basearch/certify-beta-AppStream/os` - Name: AppStream -- URL: `https://fbi.cdn.euro-linux.com/dist/eurolinux/server/9/$basearch/certify-beta-PowerTools/os` - Name: PowerTools - -!!! Warning "Limited support." - **Hybrid network installation from both ISO and public repositories - is not our primary goal in the QA process**. Packages in EuroLinux - repositories are regularly updated, and it might be impossible to - install a system from an external source. Depending on the state of the - upstream, we might not fix a potential issue. - -Below you can see an example configuration that was used to install a system - -in this case the default 'Minimal' repository has been provided as the only -one: - -![Adding additional repositories](../assets/9-beta-jumpstart/additional-repos.png) - -After changing the installation source, you will have to confirm **Software -Selection**. - -##### Software Selection - -Software Selection allows you to customize which packages will be installed. -You might choose from base environment groups like *Server with GUI*, -*Workstation* or *Minimal Install* - since we are demonstrating with the -**minimal ISO image**, only the last option is available. You can also install -additional package groups. - -![Software selection section](../assets/9-beta-jumpstart/g-inst-5.png) - -#### Anaconda installer **SYSTEM** section: - -- **Installation selection** allows choosing on which disk the system will be - installed. If you want to have a fully encrypted system, you should enable - encryption in this step. -- **KDUMP** allows choosing if KDUMP (Kernel crash dump collection mechanism) - should be enabled. -- **Network & Host Name** - you can configure your system networking here -- **Security Profile** - you can setup an additional openscap policy here - -#### Anaconda installer **USER SETTINGS** section: - -- **Root Password** - by default, the root user is disabled. If a user is - created in **User Creation** section, the root account can stay disabled -- **User Creation** section allows creating a regular user in the system. If - the *Make this user administrator* option is checked, the root account can be - disabled. - -**After applying all the necessary changes**, the installation can be started -with the "Begin Installation" button. - - -### Disk partition recommended minimums - -You need at least the following partitions. - -- `/boot` for Linux kernel and init ramdisks - 1GB -- `/` (root partition) - at least 10 GB (a very minimal system might use as - little as 2GB - but it requires extra attention and is not officially - supported by EuroLinux) - -For UEFI, an EFI system partition is also required. - -- `/boot/efi` - at least 100MB - -If your storage allows it, the following partitions are also highly -recommended: - -- `swap` - 1GB or more depending on the system RAM and workload. Swap is also - required for hibernation. Depending on the workload of the system, it should - be at least as spacious as system RAM. -- `/home` - at least 1GB - but in most cases, if `/` can be as big as 80GB, - then `/home/` usually takes the rest of the free space - -### Installing EuroLinux in basic graphic mode - -Suppose there is a problem loading/running your graphics card driver (it might -results in a black screen/error message or graphical artifacts). It's possible -to install EuroLinux in basic graphics mode. - -To do so, choose `Troubleshooting` on the welcome menu, and then *Install -EuroLinux 9 in basic graphics mode*. - -From this point the process is identical to a standard installation with GUI. - -### Installing EuroLinux in text mode - -To install EuroLinux in text mode: - -- Boot EuroLinux ISO -- Press ++esc++ to stop installation options selection timeout -- Press ++tab++ -- Add `inst.text` to the end of the kernel boot command line -- Press ++enter++ - -![Text Install 1](../assets/9-beta-jumpstart/text-inst-1.png) - -Since the Anaconda installer on EuroLinux 9 activates a network connection -automatically if applicable, it also determines that we can start VNC or use -text mode entirely. Since we are demonstrating the text mode installation, we -choose the latter option. - -![Text Install - VNC prompt](../assets/9-beta-jumpstart/text-inst-vnc-prompt.png) - -Before running the installation you have to provide all the necessary -information (represented as `!` in selection). It's a good idea to refresh the -menu with ++r+enter++ command shortly after the installer started. - -![Text Install 2](../assets/9-beta-jumpstart/text-inst-2.png) - -After customization you are ready to start your installation. - -![Text Install 3](../assets/9-beta-jumpstart/text-inst-3.png) - -### Other possibilities - -EuroLinux can also be installed in the following manner: - -- Automated installation with a kickstart file. -- Installation with PXE -- Installation via VNC (as mentioned above) - -Please consult upstream documentation about these topics. - -## Using EuroLinux - -From this point, you can use EuroLinux as any other RHEL™ based distribution. - -### Submitting a Request for Change - -We truly care. If there is something that you believe could/should be -changed/improved in the EuroLinux distribution and does not break compatibility -with the upstream project, then drop us the issue on GitHub! All contributors -are extremely welcome. - -[EuroLinux Distro Bugs and -RFC](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc/) - -### Submitting a Bug report - -We decided that submitting bug reports should not involve -registration into some nasty miserable software. At the very same -time, we know that most open-source developers have GitHub profiles. -This choice makes the decision making and work as transparent as -possible. That's why we decided to use it as the primary way to -submit bugs. - -[EuroLinux Distro Bugs and -RFC](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc/) - -This repository allows you to stay in **direct contact** with EuroLinux -developers. - -#### Other ways to submit a bug report - -- `support AT euro-linux dot com` -- [EuroLinux Support Portal (subscription - required)](https://support.euro-linux.com) - -#### Security/confidential bug report - -Please use the e-mail provided above. diff --git a/docs/jumpstarts/9-jumpstart.md b/docs/jumpstarts/9-jumpstart.md deleted file mode 100644 index cbc767b..0000000 --- a/docs/jumpstarts/9-jumpstart.md +++ /dev/null @@ -1,321 +0,0 @@ -# EuroLinux 9 Jump Start - -This document contains the necessary information to set up your first EuroLinux -9 installation. - -## System Requirements - -### x86_64 (64 bit AMD/Intel architecture) - -Minimal and recommended requirements are following: - -| Resource | Absolute minimal requirements for cloud deployment | Minimal | Recommended | -|----------|--------|------|---| -| Logical CPU | 1 | 1 | 1 | -| RAM | 1 GiB or 768 MiB with swap space| 2 GiB | 1.5 GiB per logical CPU | -| Storage | 5 GB (excluding swap)| 10GB | 20GB | - -Logical CPU means Physical CPU (including Hyper-Threading) or vCPU (virtual -CPU). - -!!! warning - It might be impossible to install EuroLinux on a system that does not meet - recommended requirements. - -#### About absolute minimums for cloud deployment - -During our internal testing, we were able to boot and use very basic and -already installed services on Virtual Machine with only 340 MiB of RAM. -However, without additional memory or at least swap space available, things -like updating the system will result in actions of Kernel Out of Memory (OOM) -Killer. - - -You can try it yourself with [EuroLinux Vagrant -boxes](https://app.vagrantup.com/eurolinux-vagrant) and the following -Vagrantfile: - -```ruby -Vagrant.configure("2") do |config| - config.vm.box = "eurolinux-vagrant/eurolinux-9" - - # Explicitly disable vbguest because we are using rsync - if Vagrant.has_plugin?("vagrant-vbguest") - config.vbguest.auto_update = false - end - - config.vm.provider "virtualbox" do |vb| - vb.memory = "340" - vb.cpus = 1 - end - config.vm.provider "libvirt" do |vb| - vb.memory = "340" - vb.cpus = 1 - end -end -``` - -It's also possible to install EuroLinux on less than 5 GB of space, but it also -requires extra attention. - -All absolute minimums for cloud deployments described above are not officially -supported by EuroLinux. - -## How to install EuroLinux 9 from ISO - -### Where can you obtain ISO? - -We distribute EuroLinux in a responsible open core model. Because of that, you -might download EuroLinux from different sources. The two primary sources are: - -- [https://fbi.cdn.euro-linux.com/isos/](https://fbi.cdn.euro-linux.com/isos/) - open for everyone -- [https://customerportal.euro-linux.com](https://customerportal.euro-linux.com) - for EuroLinux customers - -The only difference is that Customer Portal keeps older versions, when CDN, -that is used for mirroring, keeps only two of the latest ISOs for each version -to save space (single EuroLinux BaseOS ISO might take up to 8 GB). - - -If you are running a huge deployment, you might consider setting up your own -mirror and download ISOs from Intranet. - -### How to check ISO integrity - -During download, many things can happen - from a network or sending host -failure to single-bit error. To check if ISO is undamaged, there are two -mechanisms in place. - -* For each EuroLinux ISO there's a file with its checksums and appropriate - digest algorithms. Its name says, which algorithm was used to calculate the -cryptographic digest. For example, you can browse -[https://fbi.cdn.euro-linux.com/isos/](https://fbi.cdn.euro-linux.com/isos/) -and read the `sha1sums.txt` file. - - -When the ISO download is completed, you can invoke the `sha1sum` command on the -ISO file and check if checksums match. - -``` -$ sha1sum EL-9.0-x86_64-20220613-appstream.iso -d78eebb3472ddff2dcaf110907e42ccee0367f70 EL-9.0-x86_64-20220613-appstream.iso -``` - -* The second mechanism for checking ISO integrity is built-in inside the - installer itself. When you start the installation, use the `Test this media & - install EuroLinux 9` entry: - -![Installation 1](../assets/9-jumpstart/g-inst-1.png) - -After booting up, the ISO checking process will start. - -![Installation 2](../assets/9-jumpstart/g-inst-2.png) - -### Installation with GUI - -Because even a minimal installation uses a GUI the whole process is simple and -straightforward. EuroLinux 9, as well as previous versions, uses Anaconda -installer that clearly informs the user what needs to be done in order to -install the system. - -First, you have to choose the language that will be used during installation: -*Hint: since the Anaconda installer on EuroLinux 9 activates a network -connection automatically if applicable, it also determines the default language -by the automatic location detection feature - in this case you can see that -Polish has been automatically chosen.* -![Installation 3](../assets/9-jumpstart/g-inst-3.png) - -After configuring the installer language you should see a menu similar to: - -![Installation 2](../assets/9-jumpstart/g-inst-4.png) - -#### Anaconda installer **LOCALIZATION** section: - -- **Keyboard** - this section allows you to setup keyboard layouts, including - the default keyboard layout, additional layouts and key combination to switch - between them. -- **Language support** - additional languages packages that should be - installed. -- **Time & Date** - configure the date, time zone, enable NTP and NTP servers. - -#### Anaconda installer **SOFTWARE** section: - -##### Configuring source of the installation - -Here you might configure the source of your installation. By default, the -system installs from the ISO image itself. **This is one of the officially -supported ways to install EuroLinux**. - -If a NIC (Network Interface Card) has been enabled in the **Network & Host -Name** installer section, you might add additional EuroLinux repositories -and/or other repositories. If you add EuroLinux repositories, the installer -will automatically download newer version of the packages. - -EuroLinux 9 repositories: - -- URL: `https://fbi.cdn.euro-linux.com/dist/eurolinux/server/9/$basearch/BaseOS/os` - Name: BaseOS -- URL: `https://fbi.cdn.euro-linux.com/dist/eurolinux/server/9/$basearch/AppStream/os` - Name: AppStream -- URL: `https://fbi.cdn.euro-linux.com/dist/eurolinux/server/9/$basearch/CRB/os` - Name: CRB - -!!! Warning "Limited support." - **Hybrid network installation from both ISO and public repositories - is not our primary goal in the QA process**. Packages in EuroLinux - repositories are regularly updated, and it might be impossible to - install a system from an external source. Depending on the state of the - upstream, we might not fix a potential issue. - -Below you can see an example configuration that was used to install a system - -in this case the default 'Minimal' repository has been provided as the only -one: - -![Adding additional repositories](../assets/9-jumpstart/additional-repos.png) - -After changing the installation source, you will have to confirm **Software -Selection**. - -##### Software Selection - -Software Selection allows you to customize which packages will be installed. -You might choose from base environment groups like *Server with GUI*, -*Workstation* or *Minimal Install* - since we are demonstrating with the -**minimal ISO image**, only the last option is available. You can also install -additional package groups. - -![Software selection section](../assets/9-jumpstart/g-inst-5.png) - -#### Anaconda installer **SYSTEM** section: - -- **Installation selection** allows choosing on which disk the system will be - installed. If you want to have a fully encrypted system, you should enable - encryption in this step. -- **KDUMP** allows choosing if KDUMP (Kernel crash dump collection mechanism) - should be enabled. -- **Network & Host Name** - you can configure your system networking here -- **Security Profile** - you can setup an additional openscap policy here - -#### Anaconda installer **USER SETTINGS** section: - -- **Root Password** - by default, the root user is disabled. If a user is - created in **User Creation** section, the root account can stay disabled -- **User Creation** section allows creating a regular user in the system. If - the *Make this user administrator* option is checked, the root account can be - disabled. - -**After applying all the necessary changes**, the installation can be started -with the "Begin Installation" button. - - -### Disk partition recommended minimums - -You need at least the following partitions. - -- `/boot` for Linux kernel and init ramdisks - 1GB -- `/` (root partition) - at least 10 GB (a very minimal system might use as - little as 2GB - but it requires extra attention and is not officially - supported by EuroLinux) - -For UEFI, an EFI system partition is also required. - -- `/boot/efi` - at least 100MB - -If your storage allows it, the following partitions are also highly -recommended: - -- `swap` - 1GB or more depending on the system RAM and workload. Swap is also - required for hibernation. Depending on the workload of the system, it should - be at least as spacious as system RAM. -- `/home` - at least 1GB - but in most cases, if `/` can be as big as 80GB, - then `/home/` usually takes the rest of the free space - -### Installing EuroLinux in basic graphic mode - -Suppose there is a problem loading/running your graphics card driver (it might -results in a black screen/error message or graphical artifacts). It's possible -to install EuroLinux in basic graphics mode. - -To do so, choose `Troubleshooting` on the welcome menu, and then *Install -EuroLinux 9 in basic graphics mode*. - -From this point the process is identical to a standard installation with GUI. - -### Installing EuroLinux in text mode - -To install EuroLinux in text mode: - -- Boot EuroLinux ISO -- Press ++esc++ to stop installation options selection timeout -- Press ++tab++ -- Add `inst.text` to the end of the kernel boot command line -- Press ++enter++ - -![Text Install 1](../assets/9-jumpstart/text-inst-1.png) - -Since the Anaconda installer on EuroLinux 9 activates a network connection -automatically if applicable, it also determines that we can start VNC or use -text mode entirely. Since we are demonstrating the text mode installation, we -choose the latter option. - -![Text Install - VNC prompt](../assets/9-jumpstart/text-inst-vnc-prompt.png) - -Before running the installation you have to provide all the necessary -information (represented as `!` in selection). It's a good idea to refresh the -menu with ++r+enter++ command shortly after the installer started. - -![Text Install 2](../assets/9-jumpstart/text-inst-2.png) - -After customization you are ready to start your installation. - -![Text Install 3](../assets/9-jumpstart/text-inst-3.png) - -### Other possibilities - -EuroLinux can also be installed in the following manner: - -- Automated installation with a kickstart file. -- Installation with PXE -- Installation via VNC (as mentioned above) - -Please consult upstream documentation about these topics. - -## Using EuroLinux - -From this point, you can use EuroLinux as any other RHEL™ based distribution. - -### Submitting a Request for Change - -We truly care. If there is something that you believe could/should be -changed/improved in the EuroLinux distribution and does not break compatibility -with the upstream project, then drop us the issue on GitHub! All contributors -are extremely welcome. - -[EuroLinux Distro Bugs and -RFC](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc/) - -### Submitting a Bug report - -We decided that submitting bug reports should not involve -registration into some nasty miserable software. At the very same -time, we know that most open-source developers have GitHub profiles. -This choice makes the decision making and work as transparent as -possible. That's why we decided to use it as the primary way to -submit bugs. - -[EuroLinux Distro Bugs and -RFC](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc/) - -This repository allows you to stay in **direct contact** with EuroLinux -developers. - -#### Other ways to submit a bug report - -- `support AT euro-linux dot com` -- [EuroLinux Support Portal (subscription - required)](https://support.euro-linux.com) - -#### Security/confidential bug report - -Please use the e-mail provided above. diff --git a/docs/jumpstarts/cloud-jump-start.md b/docs/jumpstarts/cloud-jump-start.md deleted file mode 100644 index b713026..0000000 --- a/docs/jumpstarts/cloud-jump-start.md +++ /dev/null @@ -1,76 +0,0 @@ -# Eurolinux on clouds Jump Start - -This document contains the necessary information to create Your own EuroLinux instance on cloud You prefer. - -## Amazon Web Services (AWS) -AWS was launched in 2006 and has since grown to become one of the largest cloud computing platforms in the world, with millions of customers and clients ranging from startups to enterprises. - -### How to create EuroLinux instance on AWS -1. Check our products on [AWS Marketplace](https://aws.amazon.com/marketplace/search/results?searchTerms=eurolinux) and select Your favourite. -2. Click "Continue to Subscribe" and then "Continue to Configuration" -3. Select version, region and click "Continue to Launch" -4. Configure the instance as You prefer. Remember to select or create new key pair - it's necessary to create secure connection with instance. -5. Click "Launch" -6. To get the ip of this instance, go to the [EC2 console](https://console.aws.amazon.com/ec2/home) and select "Instances" -7. Click on Instance ID of the newly created instance and copy ip address -8. You can log into instance using the `ssh` comand with `-i key-file.pem` option - -## Microsoft Azure -With its strong focus on security and compliance, Azure has become a popular choice for organizations in regulated industries such as healthcare and finance, as well as for government agencies. - -### How to create EuroLinux instance on Microsoft Azure -1. On the [Azure Marketplace page](https://azuremarketplace.microsoft.com/en-us/marketplace/apps?search=eurolinux&page=1), click "Get It Now" and accept the service terms. -2. You will be redirected to the Azure portal, where you will see a "Create" button after logging in. -3. In the "Basics" section of the virtual machine settings menu, pay special attention to the "Administrator account" section, where you will choose the type of authentication and enter a username that you will use to log in to the machine. -4. Completing the creation of a typical virtual machine requires simply filling in the required fields in the "Basics" section. Then move on to "Review + create" and click the "Create" button. -5. Your virtual machine will be created along with all the resources needed for it to function properly. To connect to it, simply select it and use one of the connection options (SSH, RDP, or Bastion) offered by Azure. - -## Google Cloud Platform (GCP) -GCP is designed to allow developers and businesses to build, deploy, and run applications and services on Google's infrastructure. - -### How to create EuroLinux instance on GCP -1. Make sure you have `gcloud` tool and all its components installed. -2. Log into your GCP account via `gcloud` tool -3. Choose or create a new project. -4. Run the following command in the console: - ```bash - gcloud beta compute instances create [instance-name] --zone=[zone-name] --machine-type=[machine-type] --subnet=default --image=[image-url] --boot-disk-size=[disk-size] - ``` - - Where: - * `[instance-name]` is the desired name for the virtual machine. - * `[zone-name]` is the zone where the virtual machine will be created. - * `[machine-type]` is the type of machine to be created. - * `[image-url]` is the URL of the image. - * `[disk-size]` is the size of the boot disk. - - For example to create EuroLinux 8.6 instance in a us-central1-a region, type: - ```bash - gcloud beta compute instances create eurolinux-server1 --zone=us-central1-a --machine-type=n1-standard-1 --subnet=default --image=https://www.googleapis.com/compute/v1/projects/eurolinux-cloud/global/images/eurolinux-8-6 --boot-disk-size=10GB - ``` - -## Alibaba Cloud -Alibaba Cloud, also known as Aliyun aims to provide reliable and secure cloud computing solutions for businesses and organizations around the world, with a focus on serving the Asia-Pacific market. - -### How to create EuroLinux instance on Alibaba Cloud -1. Go to [Alibaba Cloud Marketplace](https://marketplace.alibabacloud.com/products?keywords=eurolinux) and select your favorite EuroLinux operating system image. -2. Review the product description and then click the "Choose Your Plan" button. You will now be redirected to the Aliyun console page where you will continue creating the instance. -3. Configure the instance to meet your needs. At this point, you can also change the payment type to subscription. -4. In the System Configurations tab, select or create a "Key Pair" that will allow you to access the machine. -5. Finally, accept the terms and create the instance by clicking "Create Instance". After a few minutes, your instance should be ready to use. - -## OpenStack -OpenStack provides a flexible and customizable platform that can be used for a variety of cloud computing needs, from web hosting to big data processing to scientific computing. - -**Important:** It is a cloud-generic images. - -### How to create EuroLinux instance on OpenStack -1. [Download](https://fbi.cdn.euro-linux.com/images) Your favourite EuroLinux image in qcow2 or raw format. For example: `https://fbi.cdn.euro-linux.com/images/EL-9-cloudgeneric-2023-03-19.qcow2` -2. Login to the OpenStack dashboard. -3. Click on the "Create Image" button in "Compute" -> "Images" section. -4. Fill in the required information and upload this image to OpenStack. -5. To Launch Your instance with image You have just created simply click "Launch Instance" in "Compute" -> "Instances" section and fill the required informations. -6. Make sure You create Your own key-pair and attach it to this instance. -7. To log into Your EuroLinux instance copy the IP address and using the `ssh` comand with `-i key-file.pem` option, login as root to newly created machine. - -**Important:** EuroLinux 9 have the root login without-password enabled by default, which means You have to assign the key-pair to Your instance to login. diff --git a/docs/jumpstarts/container-jumpstart.md b/docs/jumpstarts/container-jumpstart.md deleted file mode 100644 index 56b5f07..0000000 --- a/docs/jumpstarts/container-jumpstart.md +++ /dev/null @@ -1,87 +0,0 @@ -# EuroLinux Containers JumpStart - -## Basics - -Using EuroLinux container images is easy. We provide multiple containers and -their versions. The most important are base images for EuroLinux 7 (with FBI -[Free Base Image] repository) and EuroLinux 8 (with complete repositories - -EuroLinux 8 is freely available). All EuroLinux container images are OCI -standard container images. You can download them from two primary sources: - -- [Docker Hub - EuroLinux 8](https://hub.docker.com/r/eurolinux/eurolinux-8) -- [Docker Hub - EuroLinux 7](https://hub.docker.com/r/eurolinux/eurolinux-7) -- [Quay - EuroLinux 8](https://quay.io/repository/eurolinux/eurolinux-8) -- [Quay - EuroLinux 7](https://quay.io/repository/eurolinux/eurolinux-7) - - -EuroLinux images can be run with any OCI standardized container runtimes such -as runC (Docker/Moby project) or crun (Podman/Buildah/CRI-O). - - -**To download the image:** - -Docker Hub: -``` bash -docker pull eurolinux/eurolinux-8 -``` - -Quay.IO: -``` -podman pull quay.io/eurolinux/eurolinux-8 -``` - -To run a container that will be removed after process exit. You might use: -``` -docker run -rm -ti eurolinux/eurolinux-8 -``` - -Inside the container, you can check the system version -``` -bash-4.4# cat /etc/el-release -EuroLinux release 8.5 (Tirana) -``` - -To detach the container from the console, add `-d` flag to docker/podman run command. - -``` -docker run -rm -ti -d --name eurolinux eurolinux/eurolinux-8 -``` -then run: -``` -docker exec -it eurolinux bash -``` -to enter the console of a container. - -## Other containers - -As a company, we create and support multiple containers, including other -Enterprise Linux distributions. For example, we provide: - -- [Docker Hub - AlmaLinux](https://hub.docker.com/r/eurolinux/almalinux-8) -- [Docker Hub - Rocky](https://hub.docker.com/r/eurolinux/rocky-8) -- [Quay - AlmaLinux](https://quay.io/repository/eurolinux/almalinux-8) -- [Quay - Rocky](https://quay.io/repository/eurolinux/rocky-8) - -Other containers that we build are: - -- Oracle Linux -- Scientific Linux -- CentOS and CentOS stream - -You can visit our organization page on the [Docker -Hub](https://hub.docker.com/u/eurolinux) to find all containers that we -officially support. - -## Older Versions - -If you want to use the previous version of the EuroLinux container, you must -find the desired tag. Example for EuroLinux 8: - -- [Docker Hub - EuroLinux 8 - tags](https://hub.docker.com/r/eurolinux/eurolinux-8/tags) -- [Quay - EuroLinux - tags](https://quay.io/repository/eurolinux/eurolinux-8?tab=tags) - -## Request for Change/Comment and Bug report repository - -You can request a change, leave a comment or report a bug in this [EuroLinux -containers RFC](https://github.com/EuroLinux/containers-rfc) repository. - diff --git a/docs/jumpstarts/rpi.md b/docs/jumpstarts/rpi.md deleted file mode 100644 index ad1ea8b..0000000 --- a/docs/jumpstarts/rpi.md +++ /dev/null @@ -1,226 +0,0 @@ -# EuroLinux for Raspberry Pi Jump Start - -## About images - -EuroLinux Raspberry images are made for Raspberry Pi 4 model B. The system is -EuroLinux 9. The minimal images could work with older Raspberry Pi 3. But we -won't support it even with 'best effort' as Raspberry Pi 3 does not meet -the minimum hardware requirements for Enterprise Linux 9 or Enterprise Linux 8. - -The basic credentials are the following: - -- `user`: root -- `password`: raspberry - -!!! Info "SSH Root login disabled" - SSH root login is disabled by default on EuroLinux 9. - -!!! info "Raspberry only" - The Raspberry Pi images also won't work with other ARM-64 computers as RPI - images are specially tailored for this particular hardware. - -## Downloading and checking the images - -Firstly choose the image from -[https://fbi.cdn.euro-linux.com/images](https://fbi.cdn.euro-linux.com/images). -The Raspberry Pi images have the `rpi-TYPE`(where TYPE can be `minimal` or -`gnome`) in their names. You can download the image with `wget`, `curl` or with -your browser. - - -It's advised to check the image integrity by comparing checksums. The SHA256 -checksums can be found at -https://fbi.cdn.euro-linux.com/images/sha256sum.txt - - -Example download and checksum comparison: - -```bash -wget https://fbi.cdn.euro-linux.com/images/EuroLinux-9-rpi-minimal-2023-01-02-sda.raw.xz -sha256sum EuroLinux-9-rpi-minimal-2023-01-02-sda.raw.xz -curl -s https://fbi.cdn.euro-linux.com/images/sha256sum.txt | grep EuroLinux-9-rpi-minimal-2023-01-02-sda.raw.xz -``` - -[![asciicast](https://asciinema.org/a/549328.svg)](https://asciinema.org/a/549328) - -## Flashing the MicroSD card -With the image downloaded now, it's time to flash your MicroSD card. There are -multiple options, you can use: - -- Raspberry Pi Imager, which requires manual compilation for the most platforms -- Balena Etcher comes as AppImage so works with nearly every Linux distribution -- `dd` program, which is the most CLI-friendly way, but is also recommended for - experienced users - -We recommend Balena Etcher as dd might destroy the system partition or other -important data if used without proper experience. - -### Balena Etcher - -Balena Etcher is one of the most popular and easy-to-use programs that allow -flashing the SD cards for Raspberry Pi. It can also create other bootable media -like USB sticks and more. Firstly download the AppImage from the official -Balena Etcher website - -[https://www.balena.io/etcher/](https://www.balena.io/etcher/) (Download for -Linux x64). - -Most file managers will run AppImage when chosen and clicked. To run it from -the command line firstly change the permissions then run. -``` -chmod 755 balenaEtcher-1.13.1-x64.AppImage -./balenaEtcher-1.13.1-x64.AppImage -``` - -The process itself is straightforward. There is plenty of documentation/videos -about the Balena Etcher, so we trust that in case of any troubles you will be -able to find a solution on your own. - -### dd - -`dd` is a program that is older than Linux Kernel itself :). It is one of these -little tool that makes Linux/Unix powerful. It can be used to flash the memory -card by writing output to the memory card device. - -Firstly insert the memory card into the slot. Then check with the dmesg device -file that is corresponding. - -The dmesg will inform about partition: -``` -[ TIME] scsi 0:0:0:0: Direct-Access Generic Mass-Storage 1.11 PQ: 0 ANSI: 2 -[ TIME] scsi 0:0:0:0: Attached scsi generic sg0 type 0 -[ TIME] sd 0:0:0:0: [sdX] 250347520 512-byte logical blocks: (128 GB/119 GiB) -[ TIME] sd 0:0:0:0: [sdX] Write Protect is off -[ TIME] sd 0:0:0:0: [sdX] Mode Sense: 03 00 00 00 -[ TIME] sd 0:0:0:0: [sdX] No Caching mode page found -[ TIME] sd 0:0:0:0: [sdX] Assuming drive cache: write through -``` - -Where sdX is your SD card. To write you first need to decompress the image with -the `xzcat` command and then pipe output to the dd (writing to the device -requires root privileges, that's why there is sudo). -``` -xzcat /path/to/image/image.raw.xz | sudo dd status=progress oflag=sync bs=4k of=/dev/sdX -``` - -For example: -``` -xzcat ~/Downloads/EuroLinux-9-rpi-minimal-2023-01-02-sda.raw.xz | sudo dd status=progress oflag=sync bs=4k of=/dev/sda -``` - -## Booting from USB. - -EuroLinux 9.1 can be natively booted from USB on Raspberry Pi 4. You should -flash your USB stick/disk in the same manner that you flash a micro SD card. - -!!! info "Early-produced RPI 4 might require firmware update." - Early-produced Raspberry Pi 4 might require a firmware update before booting - the system from the USB. - -## Wifi setup - -Wifi adapter works out-of-box. It's trivial to configure it from a desktop -(Gnome). To configure the WIFI from the console you can use the following -commands. - - -Firstly find the SSID (WIFI name) that you want to use: - -```bash -nmcli d wifi list -``` - -Then you can provide a password on the command line (note password will be -saved in bash command history) - -```bash -nmcli d wifi connect WIFI_NAME password PASSWORD -``` - -or if You want to be prompted for the password - -```bash -nmcli d wifi connect WIFI_NAME --ask -``` - -[![asciicast](https://asciinema.org/a/549307.svg)](https://asciinema.org/a/549307) - -Note that your RPI will automatically connect to the WIFI after reboot. - -### Disable the powersave mode on the Raspberry Pi WIFI card - -The Raspberry Pi WIFI card by default enters powersave mode when there is not -much going on. Some users reported a problem with broken SSH sessions and other -closed connections due to this feature. To disable power save mode use the -following command - -```bash -iw wlan0 set power_save off -``` - -The problem with this solution is that this state won't survive system reboot. -To fix that issue during startup you can add a network manager dispatcher -script that will disable power_save on boot. Put the following script: - -```bash -#!/usr/bin/env bash - -interface=$1 -event=$2 - -if [[ $interface != "wlan0" ]] || [[ $event != "up" ]] -then - return 0 -fi -iw wlan0 set power_save off -``` - -into the `/etc/NetworkManager/dispatcher.d/iw-wlan0-disable-powersave.sh`, then -add the execution permission - -```bash -chmod +x /etc/NetworkManager/dispatcher.d/iw-wlan0-disable-powersave.sh -``` - -## Enabling the I2C (I²C - Inter-Integrated Circuit) -To enable i2c you have to add the `i2c_arm` with flag `on` as `dtparam` to the -`/boot/config.txt` - -```ini -dtparam=i2c_arm=on -``` - -The following script can be used: - -```bash -echo 'dtparam=i2c_arm=on' | sudo tee -a /boot/config.txt -``` - -We also recommend installing i2c-tools. - -```bash -sudo dnf install -y i2c-tools -``` - -After this changes, you have to reboot the system to start i2c. - -## Enabling SPI (Serial Peripheral Interface). -To enable SPI you have to add `spi` with flag `on` as `dtparam` to the -`/boot/config.txt` - -```ini -dtparam=spi=on -``` -The following script can be used: -```bash -echo 'dtparam=spi=on' | sudo tee -a /boot/config.txt -``` -After this changes you have to reboot the system to start SPI. - - -## Feedback - -If You want to leave feedback/request for change/bug report on EuroLinux -Raspberry Pi images please use the [https://github.com/EuroLinux/raspberry-pi-build](https://github.com/EuroLinux/raspberry-pi-build) repository. - -If believe that something important from the documentation is -missing don't hesitate to create issue in this documentation repository. diff --git a/docs/jumpstarts/vagrant-jumpstart.md b/docs/jumpstarts/vagrant-jumpstart.md deleted file mode 100644 index ed166d9..0000000 --- a/docs/jumpstarts/vagrant-jumpstart.md +++ /dev/null @@ -1,114 +0,0 @@ -# Vagrant Jumpstart - -## Introduction - -Ever wanted to create a development environment that is guaranteed to -work flawlessly on several developers' workstations without the *It -works on my machine!* excuses? -Well, now you can! Just get Vagrant, write your specification and share -it with coworkers! - -## Requirements - -Vagrant will be managing the virtual machines of the [backend provider -of your choice](https://www.vagrantup.com/docs/providers). If you find -out it's not listed, consider checking if there's a plugin-based -implementation. -Make sure you have a supported provider installed - we'll be using -VirtualBox in this guide. You can use our [VirtualBox installation -guide](../HowTo/virtualbox.md) as a reference. - -## Installation on EuroLinux 8 - -Simply run these commands and you're ready to go: - -``` -sudo dnf config-manager \ - --add-repo=https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo -sudo dnf install vagrant -y -``` - -## EuroLinux Boxes - -A *box* is a format that defines: an image of an operating system with -preinstalled software, a provider for that image and its version - it's -a ready-made appliance for that provider to run. -This appliance works the same across people's workstations, which most -likely will have differences in configuration and potentially different -providers or even operating systems. That is as long as they use a -provider, which the box is built for. - -EuroLinux Vagrant boxes are available at: -[https://app.vagrantup.com/eurolinux-vagrant](https://app.vagrantup.com/eurolinux-vagrant) -Let's use the box `eurolinux-vagrant/eurolinux-8` as an example. - -### Box details - -See the [details of the -box](https://app.vagrantup.com/eurolinux-vagrant/boxes/eurolinux-8) - -multiple providers, that the box has been built for, are listed along -with the box versions and build dates. When writing your specification, -you'll be able to choose from them as you wish. - -### Run the box - -Here's a basic procedure for running a Vagrant environment (a virtual -machine, which uses our box) in a separate directory: - -``` -mkdir el8-vagrant -cd el8-vagrant/ -vagrant init eurolinux-vagrant/eurolinux-8 -vagrant up -vagrant ssh -``` - -You should now be connected to the machine and able to perform your -desired operations inside it. -Go ahead, play around, install your favourite developer tools, build an -awesome, advanced, multi-component application and be sure everyone's -able to deploy it on their workstations without any hassle! - -## What about the specification mentioned earlier? - Vagrantfile - -Once you've ran the commands above, you'll have a *Vagrantfile* in the -*el8-vagrant* directory. -Take a look, what's inside. You'll be greeted with an introduction, -references and lots of common options along with comments explaining -them: - -``` - # The most common configuration options are documented and commented below. - # For a complete reference, please see the online documentation at - # https://docs.vagrantup.com. -``` - -As you've already ran the box as explained in the previous section, you -can see that there's no **necessity** to tweak anything inside -Vagrantfile. The parameters that you can tweak, e.g. the virtual -machine's memory or the amount of CPUs you should adapt to your work - -e.g. if you need additional resources for developing/running your -application, go ahead and increase them. Once that's done, check out if -they can be reduced once you know your software resource requirements. - -Depending on the task you want to achieve, whether it be a ready-made -appliance **or** a base virtual system that gets provisioned with your -application and its dependencies **or** something else, that's when -changes to the specification must be made - e.g. the additional -provisioning procedure shall be written. - -As the comment quoted above says, refer to the comments the Vagrantfile -provided for common options explanation. Once you know their purpose, -try them out! Get comfortable with them and read [Upstream's -documentation](https://docs.vagrantup.com/) for additional info, tips -and more advanced, cool possibilities - such as a [multi-machine -infrastructure](https://www.vagrantup.com/docs/multi-machine) defined in -a single Vagrantfile. - -## Additional resources - -- Upstream's [official website](https://www.vagrantup.com/) -- [Discover Vagrant Boxes](https://app.vagrantup.com/boxes/search?&q=eurolinux) - \- using EuroLinux as an example -- Upstream's [online documentation](https://docs.vagrantup.com.), worth - mentioning once more diff --git a/docs/jumpstarts/wsl.md b/docs/jumpstarts/wsl.md deleted file mode 100644 index 6b6ea77..0000000 --- a/docs/jumpstarts/wsl.md +++ /dev/null @@ -1,45 +0,0 @@ -# EuroLinux on WSL Jumpstart - -This guide provides a quick overview of setting up EuroLinux on Windows Subsystem for Linux (WSL). - - -## Prerequisites: - -- Windows 10 (Windows 10 version 1709 or newer for "legacy" WSL. Version 2004 or newer for WSL 2) or Windows 11 -- WSL/WSL 2 installed (we strongly recommended WSL 2 for better compatibility and performance) -- Administrative privileges on your Windows system - -## Enabling WSL - -Follow the official Microsoft documentation to enable WSL: [https://learn.microsoft.com/en-us/windows/wsl/](https://learn.microsoft.com/en-us/windows/wsl/) - -## About EuroLinux on WSL - -EuroLinux company provides EuroLinux version 9 for WSL. The system is based on Red Hat -Enterprise Linux 9 and is compatible with it. We used our base container image. The official -repository is located [https://github.com/EuroLinux/wsl](https://github.com/EuroLinux/wsl) it also contains the build scripts and -latest documentation/releases. - -## Import and install EuroLinux for WSL - -- x86_64 - ```bash - wget https://github.com/EuroLinux/WSL/releases/latest/download/el9-x86_64.tar -o el9-x86_64.tar - wsl --import EuroLinux-9 "$env:USERPROFILE/EuroLinux-9" .\el9-x86_64.tar --version 2 - wsl -d EuroLinux-9 - ``` - -- aarch64 - ```bash - wget https://github.com/EuroLinux/WSL/releases/latest/download/el9-aarch64.tar -o el9-aarch64.tar - wsl --import EuroLinux-9 "$env:USERPROFILE/EuroLinux-9" .\el9-aarcch64.tar --version 2 - wsl -d EuroLinux-9 - ``` - - -## Feedback - -To provide feedback, request changes, or report bugs, please visit our official -RFC/Bug repository at -[https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc.](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc) -Your input is highly appreciated! diff --git a/docs/knowledge-base/el6-jdk-install-failure.md b/docs/knowledge-base/el6-jdk-install-failure.md deleted file mode 100644 index 014407e..0000000 --- a/docs/knowledge-base/el6-jdk-install-failure.md +++ /dev/null @@ -1,20 +0,0 @@ -# Unable to install java-1.7.0-openjdk on EuroLinux 6 - -## Scenario - -An attempt to install the latest version of `java-1.7.0-openjdk.x86_64` as part of the [EuroELS](https://en.euro-linux.com/eurolinux/euroels/) subscription fails with a message like: - -``` -Error in PRETRANS scriptlet in rpm package 1:java-1.7.0-openjdk-1.7.0.261-2.6.22.1.el6_10.x86_64 -error: lua script failed: /usr/libexec/copy_jdk_configs.lua:272: attempt to index global 'file' (a nil value) -``` - -## Solution - -The package `java-1.7.0-openjdk.x86_64` expects that the directory `/var/lib/rpm-state/` exists. Still, this might not be the case on every installation. - -Please create this directory manually: - -``` -# mkdir /var/lib/rpm-state/ -``` diff --git a/docs/knowledge-base/eurolinux-6-vault.md b/docs/knowledge-base/eurolinux-6-vault.md deleted file mode 100644 index ef67026..0000000 --- a/docs/knowledge-base/eurolinux-6-vault.md +++ /dev/null @@ -1,58 +0,0 @@ -# Accessing EuroLinux 6.10 Vaulted Repositories - -## EuroLinux 6 ELS EOL 2024-06-30 - -EuroLinux 6 reached its end of life on 2020-11-30; EuroLinux 6 ELS -reached EOL on 2024-06-30 and is no longer supported. This means critical -security updated are no longer provided, making your system highly vulnerable -to security threats. - - -Upgrading might not always be possible due to reasons like replicating a -specific production environment in development, supporting legacy systems, or -strict software compatibility requirements. In such cases, while accessing the -vaulted repositories is an option, be aware of the inherent security risks. - - -## EuroLinux 6 vault - -Using the following gist is a straightforward way to access the EuroLinux 6 -vault: - - - -Or manually add the following to `/etc/yum.repos.d/eurolinux-6-vault-repos.repo`: - -```ini -[eurolinux6-base] -name=Eurolinux 6 Base Vault -baseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/6/6.10/BaseOS/x86_64/os/ -gpgcheck=1 -gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux - -[eurolinux6-extras] -name=Eurolinux 6 Updates Vault -baseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/6/6.10/Extras/x86_64/os/ -gpgcheck=1 -gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux -``` - -If the GPG key is not present on your system, you can add it with the following -command: - -```bash -curl -o /etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux https://fbi.cdn.euro-linux.com/security/RPM-GPG-KEY-eurolinux -``` - -## Removing subscription packages - -Previously, due to EuroLinux 6 repositories being paywalled, a subscription was -required. This involved tools like `rhn_register` or `el_register` alongside -the EuroMan service or a local mirror. With EuroMan's sunsetting alongside -EuroLinux 6 ELS EOL, these subscription-related packages are no longer -necessary (unless using custom Spacewalk/EuroMan Forman/EuroMan). You can -safely remove them using the following command: - -```bash -sudo yum remove -y rhn* subscription* -``` diff --git a/docs/knowledge-base/eurolinux-7-vault.md b/docs/knowledge-base/eurolinux-7-vault.md deleted file mode 100644 index 3912209..0000000 --- a/docs/knowledge-base/eurolinux-7-vault.md +++ /dev/null @@ -1,94 +0,0 @@ -# Using EuroLinux 7 from vaulted repositories - -## EuroLinux 7 EOL 2024-06-30 - -EuroLinux 7 reached its end of life on 2024-06-30. It means no further updates, -including security updates, will be available. We strongly recommend upgrading -to EuroLinux 8 or later as soon as possible. However, you may still need to use -the older version for development, legacy, and compatibility reasons. - -## EuroLinux 7 vault - -Using the following gist is a straightforward way to access the EuroLinux 7 -vault: - - - - -Or manually add the following to `/etc/yum.repos.d/eurolinux-7-vault-repos.repo`: - -```ini -[eurolinux7-base] -name=Eurolinux 7 Base Vault -baseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/7/7.9/os/ -gpgcheck=1 -gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7 - -[eurolinux7-updates] -name=Eurolinux 7 Updates Vault -baseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/7/7.9/updates/ -gpgcheck=1 -gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7 -``` - - -The GPG key should be available in the system, but if it is not, you can add it -with the following: - - -```bash -curl -o /etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7 https://fbi.cdn.euro-linux.com/security/RPM-GPG-KEY-eurolinux7 -``` - -## EuroLinux 7.8 and 7.7 - -As a bonus, you could also use even older versions of EuroLinux 7.8 and 7.7, -which contain only updates up to the last minor release of the given version. -Sample content of the `.repo` files are below: - -For EuroLinux 7.8: -```ini -[eurolinux7-base] -name=Eurolinux 7.8 Base Vault -baseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/7/7.8/os/ -gpgcheck=1 -gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7 - -[eurolinux7-updates] -name=Eurolinux 7.8 Updates Vault -baseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/7/7.8/updates/ -gpgcheck=1 -gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7 -``` - -For EuroLinux 7.7: -```ini -[eurolinux7-base] -name=Eurolinux 7.8 Base Vault -baseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/7/7.7/os/ -gpgcheck=1 -gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7 - -[eurolinux7-updates] -name=Eurolinux 7.8 Updates Vault -baseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/7/7.7/updates/ -gpgcheck=1 -gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7 -``` - - -## Removing subscription packages - -Since the EuroLinux 7 repositories were behind the paywall, you used to need -the subscription that used `rhn_register` or `el_register` commands and ancient -EuroMan service or local mirror of the system. EuroMan was sunsetted with -EuroLinux 7 EOL. - - -You can confidently remove the subscription-related packages (as long as you -are not using custom Spacewalk/EuroMan Forman/EuroMan) with the following -command: - -```bash -sudo yum remove -y rhn* subscription* -``` diff --git a/docs/knowledge-base/eurolinux-8-10-efi-problem.md b/docs/knowledge-base/eurolinux-8-10-efi-problem.md deleted file mode 100644 index 65d8dec..0000000 --- a/docs/knowledge-base/eurolinux-8-10-efi-problem.md +++ /dev/null @@ -1,214 +0,0 @@ -# Black Screen After update to EuroLinux 8.10 - EFI problem - -## Background - -We are deeply sorry to inform you that one of the packages in EuroLinux 8.10 -created a severe mistake in the boot configuration. The package grub2-efi-x64 -was copied from a never-released beta repository, and it was not supposed to be -there in that version. - - -If you updated your system: - -- before May 28th, 13 CET -- and you are using EFI - -The following error might appear after booting your system. - -``` -error: file `/EFI/eurolinux/grubx64.efi` Not Found. -``` - -and other similar errors, like: - -``` -StartImage failed -``` - -Generally speaking, the system won't boot into the bootloader (GRUB). -Depending on your UEFI software, you might see different error messages. - - -Depending on your UEFI software you might be able to boot system normally. If -you can boot system you can fix the problem by reinstalling the `grub2-efi-x64` -package. - -![Example message screen](../assets/wrong-efi/wrong-efi-screen.png) - -## When this problem does not occur - -- If you are using a VM that does not use EFI you won't have this problem -- If you are using legacy BIOS and the system was installed as legacy BIOS -- Container images and other images - - -## Update after May 28th, 12 CET - - -If you are updating your system with a repository synced after May 28, 13 CET, -you should not have this problem. The package was removed and overwritten from -the repository, and the proper package was added. - - -## Updated but not rebooted system -If you updated but have not rebooted the system -> please reinstall the -grub2-efi-x64 package and kernel packages: - -``` -sudo yum clean all -sudo yum reinstall -y `kernel*` `grub2*` -``` - -## ISO files - -The ISO files were updated, and the previous ISO was removed. The new ISO is -supposed to be released today (May 28th). - -## Revert from backup/snapshot - -If you can, please revert from the backup or snapshot to version 8.9. The -update process now contains overwritten, updated and proper packages, and this -problem will not occur. - -## Rescue system with wrong EFI from a live CD. - -1. Download LiveISO CD -2. Change boot order (if necessary) -3. Mount ISO/Create ISO on the pendrive -4. Start system from ISO -5. Mount the EFI partition -6. Copy the EFI files -7. Run system normally -8. Reinstall kernel-core and grub2-efi-x86 - - - -## Download LiveISO CD - -One of the smallest ISO and well-known projects is Rescatux. You can download -it from: -https://sourceforge.net/projects/rescatux/files/rescatux-0.74/rescatux-0.74.iso/download - - -You can use different ISOs, such as our Desktop Live or Ubuntu. - -## Change the boot order (if necessary) - -Changing the boot order might be necessary for both VM and Physical Machines. - -## Mount ISO/Create ISO on pendrive - -Mount rescue ISO to a VM. For physical machines, create a bootable pendrive -with the ISO. The process is similar to creating a bootable pendrive for -installation. - -After mounting or inserting the pen drive, start the rescue/live CD system. - -## Starting rescuetux or other livecd - -You can safely start Rescuetux or another live CD. The process is similar to -getting a standard desktop. You can safely skip any questions and programs and -get straight to the terminal. - - -![Rescue 1](../assets/wrong-efi/rescue-tux-1.png) - -## Find and mount the EFI partition - -Finding an EFI partition is quite straightforward use one of the following commands: - -``` -sudo lsblk -``` - -Example efi partition output - -``` -/dev/nvme0n1p5: UUID="2A1E-AC26" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="6b15bd77-bb2e-4393-9fbb-445625660679" -``` - -or - -``` -lsblk -f -``` -Example EFI partition output - -``` -vda1 vfat 776-93D0 -``` - -After finding the EFI partition, mount it to a temporary location. In the -example bellow, we are using `/mnt` as a temporary location, and partition is -the `/dev/vda1` - -``` -sudo mount /dev/vda1 /mnt -``` - -Confirm the EFI partition is mounted correctly and contains EFI directory - -``` -cd /mnt/ -ls -``` - -The output should contains at least an EFI directory - -``` -EFI -``` - -## Copy the EFI files - -``` -sudo cp -r /mnt/EFI/redhat/* /mnt/EFI/eurolinux/. -``` - - -## Reboot system - -Depending on the live CD/ISO you used, you might need to reboot the system or exit the live CD. - -``` -sudo reboot -``` -in most cases, is enough. You can also shut down the system with shutdown -h now. - - -Before starting the EuroLinux system, remember to remove the rescue/LiveCD ISO -ISO or pendrive. - - -The whole process is as simple as the one on the screenshot: - -![Rescue 2](../assets/wrong-efi/rescue-tux-2.png) - -## Running the system and reinstalling the packages - - -After rebooting the system you should be able to boot into the system in normall state. You can now reinstal the kernel -and grub packages. - -``` -sudo yum clean all -sudo yum reinstall -y `kernel*` `grub2*` -``` - -![Reinstall](../assets/wrong-efi/reinstall.png) - -## Summary - - -Once more, we are deeply sorry for the inconvenience. The bug skipped our -testing and escaped into the public as we were changing the test structure to -support new features, including Secure Boot for EuroLinux 9. - - -We are working on improving our testing process to avoid such mistakes in the -future. - - -If you have any questions or need help, please contact us at support at -euro-linux.com. We will dispatch an engineer for a one-on-one session to assist -you. diff --git a/docs/knowledge-base/eurolinux-capabilities-and-limits.md b/docs/knowledge-base/eurolinux-capabilities-and-limits.md deleted file mode 100644 index 4a57b14..0000000 --- a/docs/knowledge-base/eurolinux-capabilities-and-limits.md +++ /dev/null @@ -1,134 +0,0 @@ -# EuroLinux Linux distribution capabilities and limits - -This document describes the technology capabilities and limits for EuroLinux 6, -7, 8 and 9. Some are theoretical, as they are connected with source -code/projects -used in the system. Minimal limits represent limits for the systems for which -support is generally available by the EuroLinux company. Our dedicated -solutions like: - -- system rebuilds with Gaia build stack -- EuroLinux container images -- EuroLinux cloud images -- EuroLinux for edge computing -- EuroLinux ARM 64 for IoT -- containers running on the EuroLinux container platform or any other - Kubernetes-based platform - -might run and be supported on the less resources than described in this document. - -The theoretical limit (connected with a version of the software used) is marked -as `(LIMIT)`, when limit supported and tested by upstream is provided as -default for EuroLinux. **TBA** means - **To Be Announced**. - -## Minimum logical CPU - -All systems, physical or virtual, require at minimum 1 logical (physical or -virtual) CPU core. - -## Maximum logical CPU - - - -| Architecture | EuroLinux 6 | EuroLinux 7 | EuroLinux 8 | EuroLinux 9 | -|---|---|---|---|---| -| x86_64 | 448 (4096) | 768 (5120) | 768 (8192) | 1792 (8192) | -| ARM64 | X | X | 256 | 512 (4096) | - - - -## Minimum memory - -These requirements are only for systems supported as VMs or Physical hosts. In -most cases, it's possible to run a system without complications on less memory. -The minimum requirements have been provided below because it might not be -possible to support systems with less memory. - - -| Architecture | EuroLinux 6 | EuroLinux 7 | EuroLinux 8 | EuroLinux 9 | -|---|---|---|---|---| -| x86_64 | Minimum 1 GiB, 1 GiB per logical core is recommended | Minimum 1 GiB, 1 GiB per logical core is recommended | Minimum 1 GiB, 1.5 GiB per logical core is recommended | Minimum 1.5 GiB, 1.5 GiB per logical core is recommended | -| ARM64 | X | X | 2GiB | 2GiB | - - -## Maximum memory - -| Architecture | EuroLinux 6 | EuroLinux 7 | EuroLinux 8 | EuroLinux 9 | -|---|---|---|---|---| -| x86_64 | 12TB (64TB) | 12TB (64TB) | 24TB (64TB) | 48TB (64TB) | -| ARM64 | X | X | 1.5TB (256TB) | 1.5TB (256TB) | - - -## Minimum required disk space - -| EuroLinux 6 | EuroLinux 7 | EuroLinux 8 | EuroLinux 9 | -|---|---|---|---| -| 1Gib Minimum, 5GiB recommended | 5 GiB Minimum, 20 GiB recommended | 10 GiB Minimum, 20 GiB recommended | 10 GiB Minimum, 20 GiB recommended | - -## File systems and storage limits - -All filesystems in this document support ACL (Access Control List). - -### Ext3 - -Ext3 is mostly a legacy filesystem. Please use Ext4 or XFS. - -| Feature | EuroLinux 6 | EuroLinux 7 | EuroLinux 8 | EuroLinux 9 | -|---|---|---|---|---| -| Maximum File Size | 2TiB | 2TiB | 2TiB | 2TiB | -| Maximum Filesystem Size | 16TiB | 16TiB | 16TiB | 16TiB | -| Maximum Subdirectories or files in directory | 32000 | 32000 | 32000 | 32000 | -| Maximum symlink depth | 8 | 8 | 8 | 8 | - - -### Ext4 - -Ext4 is the default filesystem for EuroLinux 6. - -| Feature | EuroLinux 6 | EuroLinux 7 | EuroLinux 8 | EuroLinux 9 | -|---|---|---|---|---| -| Maximum File Size | 16TiB | 16TiB | 16TiB | 16TiB | -| Maximum Filesystem Size | 1EiB | 1EiB | 1EiB | 1EiB | -| Maximum Subdirectories or files in directory | 65000/unlimited with `dir_nlink` option | 65000/unlimited with `dir_nlink` option | 65000/unlimited with `dir_nlink` option | 65000/unlimited with `dir_nlink` option | -| Maximum symlink depth | 8 | 8 | 8 | 8 | - -### XFS - -XFS is the default filesystem for in EuroLinux 7, 8 and 9. - -| Feature | EuroLinux 6 | EuroLinux 7 | EuroLinux 8 | EuroLinux 9 | -|---|---|---|---|---| -| Maximum File Size | 8EiB | 8EiB | 8EiB | 8EiB | -| Maximum Filesystem Size | 16EiB | 16EiB | 1PiB | 1PiB | -| Maximum Subdirectories or files in directory | unlimited | unlimited | unlimited | unlimited | -| Maximum symlink depth | 8 | 8 | 8 | 8 | - - -### GFS2 - -Global Filesystem 2 is part of EuroLinux Resilient Storage and High -Availability add-ons that are freely available with subscription or free -available in the Open Core model. - -| Feature | EuroLinux 6 | EuroLinux 7 | EuroLinux 8 | EuroLinux 9 | -|---|---|---|---|---| -| Maximum File Size | 8EiB | 8EiB | 8EiB | 8EiB | -| Maximum Filesystem Size | 8EiB | 8EiB | 8EiB | 8EiB | -| Maximum Subdirectories or files in directory | unlimited | unlimited | unlimited | unlimited | -| Maximum symlink depth | unlimited | unlimited | unlimited | unlimited | - - -### Kernel and the most important components versions - -| Feature | EuroLinux 6 | EuroLinux 7 | EuroLinux 8 | EuroLinux 9 | -|---|---|---|---|---| -| Base Linux Kernel version | 2.6.34 | 3.10 | 4.18 | 5.14 | -| Package Management | RPM/Yum | RPM/Yum | RPM/Dnf, Flatpak| RPM/Dnf, Flatpak | -| System Init | Upstart | systemd | systemd | systemd | -| Base GNU C Library (glibc) Version | 2.12 | 2.17 | 2.28 | 2.34 | -| Base (First) GCC version | 4.4.7 | 4.8.5 | 8.2.1 (updated in newer versions) | 11.2.1 (might be updated in the future)| -| Base (First) LLVM version | X | X | 7.0.1 (updated in newer versions)| 13.0.0 (might be updated in the future) | -| Default Desktop | Gnome 2 | Gnome 3 | Gnome 3 | Gnome 40 | -| Office Suite | LibreOffice | LibreOffice | LibreOffice | LibreOffice | -| Default Web Browser | Firefox | Firefox | Firefox | Firefox | -| Default Mail Client | Thunderbird | Evolution or Thunderbird | Evolution or Thunderbird | Evolution or Thunderbird | diff --git a/docs/knowledge-base/eurolinux-vault-policy.md b/docs/knowledge-base/eurolinux-vault-policy.md deleted file mode 100644 index 980b9aa..0000000 --- a/docs/knowledge-base/eurolinux-vault-policy.md +++ /dev/null @@ -1,83 +0,0 @@ -# EuroLinux Vault and Archiving Policy - -## Vault - vault.cdn.euro-linux.com - -The idea of the vault is simple - it stores older or archived versions of the -software packages (mostly RPMs) and allow to create and maintain the -environment that requires old versions of the packages, specific libraries or -cannot or even must not be updated. - -!!! warning "Warning! Security considerations" - Due to their nature, the old versions of the software contain security - vulnerabilities. Many of them have ready and easy to use exploits. Using - unsupported versions of software is a dangerous practice, especially - when system is running in the public networks. - - -## Vault's initial and last version for minor releases - -From version 8.6 and 9.0 we decided that we will provide three versions for -each minor release (minor release is for example EuroLinux 8.6 -> 8.7 -> 8.8), -of the vault. The first one is the initial state of the release, then there is -current state (for living release), the third one has '-last' and it's the last -snapshot before a new minor release. This idea originated from community -feedback. For example in case of EuroLinux 8.7 (that in time of writing this -documentation is the latest minor release): - -- [https://vault.cdn.euro-linux.com/legacy/eurolinux/8/8.7-init/](https://vault.cdn.euro-linux.com/legacy/eurolinux/8/8.7-init/) - contains the initial state for 8.7 -- [https://vault.cdn.euro-linux.com/legacy/eurolinux/8/8.7/](https://vault.cdn.euro-linux.com/legacy/eurolinux/8/8.7/) - contains the current state of EuroLinux 8.7 -- [https://vault.cdn.euro-linux.com/legacy/eurolinux/8/8.7-last/](https://vault.cdn.euro-linux.com/legacy/eurolinux/8/8.7-last/) - **Will** contain the last snapshot for 8.7 before general availability of the - EuroLinux 8.8. It will be just a symbolic link to 8.7 that will mark the EOL - of this minor release. - -If there is no version with `-last` suffix it means that this version is a -newest minor release or the `-last` was not created. - -## Vault for the current version - -For your convince EuroLinux Vault also keeps the track of the current version -of the EuroLinux as a symbolic link to **the newest minor release**. The -symlinks are `8` for version 8 and `9` for version 9. - -- [https://vault.cdn.euro-linux.com/legacy/eurolinux/8/8/](https://vault.cdn.euro-linux.com/legacy/eurolinux/8/8/) -- [https://vault.cdn.euro-linux.com/legacy/eurolinux/9/9/](https://vault.cdn.euro-linux.com/legacy/eurolinux/9/9/) - -These repositories are updated regularly in the same manner as main/mirrors -repositories. - -## EuroLinux sources on vault.cdn.euro-linux.com - -We used to provide sources for EuroLinux on GitHub. Unfortunately, due to -GitHub's limitations, it wasn't as feasible in long run. Each source needed to -be repacked on the client system and source wasn't signed. - - -We decided to go with a friendlier and more standarized direction after -receiving feedback from the community and clients. Since version 8 we deliver -the sources as .src.rpms. It's a better solution in many ways, and the -advantages include: - -- All source packages (sources used to build EuroLinux and other Enterprise - Linux distributions) are securely signed cryptographically -- The src.rpm is native format for distributions that leverage RPMs. It allows - to use common toolchains like mock, rpmbuild, EuroLinux Gaia, Open Build - Service, Koji and much more -- It's easier to mirror repositories -- It's also easier to maintain - - -The source can be found at -[https://vault.cdn.euro-linux.com/sources/eurolinux/](https://vault.cdn.euro-linux.com/sources/eurolinux/). - - -## Bug tracker - -If you encounter any missing sources or problem with vault, please don't -hesitate to contact as via e-mail (support[at]euro-linux.com) or fill bug in -our [distro bug -tracker](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc). If you -are our client you can contact us on the support site or with sale -representative. diff --git a/docs/knowledge-base/unable-to-find-requested-software.md b/docs/knowledge-base/unable-to-find-requested-software.md deleted file mode 100644 index e77fe21..0000000 --- a/docs/knowledge-base/unable-to-find-requested-software.md +++ /dev/null @@ -1,47 +0,0 @@ -# Unable to Find Requested Software - -## Environment - -- EuroLinux 7 -- EuroLinux 8 - -## Issue - -An error occurs during a search for missing components. A similar message is -shown by GNOME Software: - -> Unfortunately, the [...] you were searching for could not be found. Please -> see [...] for more information. - -### Missing Package - -The package you are searching for is not available in EuroLinux base -repositories. - -### Missing Codec - -The codec you are searching for is not available in EuroLinux base -repositories due to licensing reasons or patent encumbrance. - -### Missing Hardware Support - -A kernel module or a driver is not available in EuroLinux base repositories -due to licensing reasons that prohibit redistribution or is not yet in the -upstream Linux kernel. - -### Missing Font - -The font you are searching for is not available in EuroLinux base -repositories. - -### Missing MIME Support - -An application that supports operations on your file with its MIME type is not -available in EuroLinux base repositories due to them being supported -exclusively by a third party application or an application that runs only on a -platform different than EuroLinux. - -## Resolution - -If you would like to request for a certain component availability, please -[contact us](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc). diff --git a/docs/release-notes/8.10.md b/docs/release-notes/8.10.md deleted file mode 100644 index 2ea95a5..0000000 --- a/docs/release-notes/8.10.md +++ /dev/null @@ -1,91 +0,0 @@ -# EuroLinux 8.10 Release Notes - -This version’s code name is Bucharest - the capital of Romania, also known as “Paris of the East”. - -## Major changes in EuroLinux 8.10. - -## Security - -Key security-related highlights: - -- **OpenSSL** adds API-level protection for RSA PKCS #1 v1.5 decryption process. -- **libkcapi** delivers new functions and tools. -- **stunnel** provides many new SSL-related features. - -## Programming languages, web and database servers - -Later versions of the following application are now available: - -- **MariaDB 10.11** -- **nginx 1.24** -- **PHP 8.2** -- **PostgreSQL 16** -- **Python 3.12** - -The following components have been upgraded: - -- **Git LFS** to version 3.4.1 -- **Git** to version 2.43.0 - -## Compilers and development tools -## Updated performance tools and debuggers - -The following performance tools and debuggers have been updated: - -- **elfutils 0.190** -- **Valgrind 3.22** - -## Updated compiler toolsets - -The following compiler toolsets have been updated: - -- **GCC Toolset** 13 -- **Go Toolset** 1.21.0 -- **LLVM Toolset** 17.0.6 -- **Rust Toolset** 1.75.0 - -## Java implementations in EuroLinux 8 - -The EuroLinux 8 AppStream repository includes: - -- The `java-21-openjdk` packages, which provide the OpenJDK 21 Java Runtime Environment and the OpenJDK 21 Java Software Development Kit. -- The `java-11-openjdk` packages, which provide the OpenJDK 11 Java Runtime -Environment and the OpenJDK 11 Java Software Development Kit. -- The `java-17-openjdk` packages, which provide the OpenJDK 17 Java Runtime -Environment and the OpenJDK 17 Java Software Development Kit. -- The `java-1.8.0-openjdk` packages, which provide the OpenJDK 8 Java Runtime Environment and the OpenJDK 8 Java Software Development Kit. - -## Batteries repositories - -Batteries repository contains packages that are needed to rebuild the -distribution but are not included in any upstream repositories. Right now, -this repository includes more than 3000 packages for each buildroot. - -## Known issues - -- The AppStream is is about 15GiB. After long discussion and feedback we - decided to keep it RHEL like way, where AppStream ISO is so full because it - can be used to mount repositories used for mirroring and system. We are - sorry but current state (mostly modularity) make things extremely hard to - manage without breaking user experience. -- Due to evolution of build process update for **SCAP Security Guide** are delayed now. They are going to be delivered soon. - -## Gaia build system - -We are currently using Gaia 3.0 and preparing 4.0 with branding kit. - -## Container and cloud images - -You can use the following publicly available images for EuroLinux 8: - -- [EuroLinux 8 Vagrant Boxes (libvirt/VMware Workstation/VirtualBox)](https://app.vagrantup.com/eurolinux-vagrant/boxes/eurolinux-8) -- [EuroLinux 8 Container on the Docker Hub](https://hub.docker.com/r/eurolinux/eurolinux-8) -- [EuroLinux 8 Container on the Quay.io](https://quay.io/repository/eurolinux/eurolinux-8) - -## Additional resources - -- [Download EuroLinux ISO](https://fbi.cdn.euro-linux.com/isos/) -- [Download EuroLinux ISO secondary download](https://fbi2.cdn.euro-linux.com/isos/) -- [EuroLinux universal migration scripts](https://github.com/EuroLinux/eurolinux-migration-scripts) -- [EuroLinux Public Request for Change and Bug Tracker](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc) -- [Red Hat 8.10 Release Notes](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/8.10_release_notes/index) parts of our release notes are loosely based on this document. diff --git a/docs/release-notes/8.3.md b/docs/release-notes/8.3.md deleted file mode 100644 index cc98bdb..0000000 --- a/docs/release-notes/8.3.md +++ /dev/null @@ -1,68 +0,0 @@ -# EuroLinux 8.3 Release Notes - -## Dynamic programming languages -Later versions of the following components are now available: - -- **Node.js 14** - module `nodejs` stream 14 -- **Perl 5.30** - module `perl` stream 5.30 -- **PHP 7.4** - module `php` stream 7.4 -- **Ruby 2.7** - module `ruby` stream 2.7 -- **Java 11 with OpenJDK** - new version of Open Java Development Kit (OpenJDK) - is now available as standalone rpms packages. - -## Web and Database servers - -Later versions of the following components are now available - -- **nginx 1.18** - module `nginx` stream 1.18 - -## Compiler toolsets - -The following compiler toolsets have been updated in EL 8.3: - -- **GCC Toolset 10** - software collection `gcc-toolset-10` -- **LLVM Toolset 10.0.1** - module `llvm-toolset` -- **Rust Toolset 1.45.2** - module `rust-toolset` -- **Go Toolset 1.14.7** - module `go-toolset` - - -## Security - -- EuroLinux 8.3 provides Ansible roles for automated deployments of - Policy-Based Decryption (PBD) solutions using **Clevis** and **Tang**. New - version of the package `rhel-system-roles` adds an Ansible role for - EuroLinux logging through **Rsyslog**. - -- The **USBGuard** framework now provides: - - its own SELinux policy - - notification for user in GUI - - multiple enhancement and bug fixes - -## General updates and improvements - -- **Git** was updated to version 2.27 -- **Squid** was updated to version 4.11 -- The **Tuned** system tuning tool has been rebased to version 2.13. This - version adds support for architecture-dependent tuning and ability to use - multiple include directives. - -### Identity Management - -The Rivest Cipher 4 (RC4) cipher suite, the default encryption type for users, -services, and trusts between Active Directory domains in an Active Directory -forest, has been deprecated in EuroLinux 8. For compatibility, this -release introduces cryptographic subpolicy named *AD-SUPPORT* to enable -support for this deprecated encryption type. The new subpolicy allows you to -use RC4 with EuroLinux IPA and SSSD Active Directory. - -### The web console - -The cockpit web console provides an option to switch between superuser -access and limited access from inside of a user session. - -### Desktop and graphics - -The **Direct Rendering Manager** (DRM) kernel graphics subsystem has been -rebased to upstream Linux kernel version 5.6. It provides a number of -enhancements over the previous versions, including support for new GPUs and -APUs. diff --git a/docs/release-notes/8.4-beta.md b/docs/release-notes/8.4-beta.md deleted file mode 100644 index 1581fed..0000000 --- a/docs/release-notes/8.4-beta.md +++ /dev/null @@ -1,87 +0,0 @@ -# EuroLinux Beta 8.4 Release Notes - -## Dynamic programming languages - -Later versions of the following components are now available: - -- **Python 3.9** - module `python39` stream 39. -- **SWIG 4.0** - module `swig` stream 4.0 - -## Web and Database servers - -Later versions of the following components are now available: - -- **Redis 6** - module `redis` stream 6 -- **PostgreSQL 13** - module `postgresql` stream 13 -- **MariaDB 10.5** - module `mariadb` stream 10.5 - -## Compiler Toolset - -The following compiler toolsets have been updated in EL 8.4: - -- **GCC Toolset 10** - software collection `gcc-toolset-10` -- **LLVM Toolset 11.0.0** - module `llvm-toolset` stream `rhel` -- **Rust Toolset 1.49.0** - module `rust-toolset` stream `rhel` -- **Go Toolset 1.15.7** - module `go-toolset` stream `rhel` - -There is new a module containing Persistent Memory Development Kit (PMDK): - -- **PMDK** - module `pmkd` stream `1_fileformat_v6` - -## Security - -- **IPsec VPN** provided by Libreswan now supports TCP encapsulation and - security labels for IKEv2. -- The **OpenSCAP** packages have been rebased to version 1.3.4, - **scap-security-guide** has been rebased to version 0.1.54. -- The **fapolicyd** framework now provides integrity checking, and the - RPM plugin now registers any system update handled by either the - YUM package manager or the RPM Package Manager. - -## General updates and improvements - -- EuroLinux 8.4 offers now **Subversion 1.14**. It's packed as the module - `subversion` with stream 1.14. The 1.10 stream remain the default module that - contains this package. -- New module `eclipse`. This module has Eclipse IDE but is commonly used - to build Java related packages. -- The *nmstate* packages provide a library and the *nmstatectl* command-line - utility to manage host network settings declaratively. Nmstate is a - network API for hosts and is fully supported in EuroLinux 8.4. The Multi-protocol - Label Switching (MPLS) is an in-kernel data-forwarding mechanism to route - traffic flow across enterprise networks. - -- The *iproute2* utility introduces three new traffic control actions. -- EuroLinux 8 kernel now uses **proactive compaction** that regularly - initiates memory compaction work before a request for an allocation is made. - Therefore, **latency for specific memory allocation requests is lowered**. -- EuroLinux 8 kernel has now a new implementation of a slab memory controller - for control groups. -- EuroLinux kernel now supports the time namespace feature. It allows changing - date and time inside the Linux containers. -- EuroLinux 8 kernel now supports the Error Detection and Correction (EDAC) in - 8th and 9th generation Intel Core Processors. -- There are changes in the pacemaker resource agent - it now can detect - failures asynchronously and inject a failure into Pacemaker - immediately without waiting for the following monitor interval. - -## Batteries - -Batteries repository contains packages that are needed to rebuild distribution -but are not included in upstream repositories. Right now, this repository -includes more than 2000 packages for each buildroot. - -Multiple batteries were updated for this release there including: - -- mdds -- meson -- spirv-headers -- fontforge -- multiple python packages -- modules for bootstrapping python39 - -## Additional resources - -- [Red Hat 8.4 - Release-Notes](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/8.4_release_notes/index) - part of our release notes, are loosely based on this document. diff --git a/docs/release-notes/8.4.md b/docs/release-notes/8.4.md deleted file mode 100644 index 68ce1dd..0000000 --- a/docs/release-notes/8.4.md +++ /dev/null @@ -1,155 +0,0 @@ -# EuroLinux 8.4 Release Notes - -## Dynamic programming languages - -Later versions of the following components are now available: - -- **Python 3.9** - module `python39` stream 39. -- **SWIG 4.0** - module `swig` stream 4.0 - -## Web and Database servers - -Later versions of the following components are now available: - -- **Redis 6** - module `redis` stream 6 -- **PostgreSQL 13** - module `postgresql` stream 13 -- **MariaDB 10.5** - module `mariadb` stream 10.5 - -## Compiler Toolset - -The following compiler toolsets have been updated in EL 8.4: - -- **GCC Toolset 10** - software collection `gcc-toolset-10` -- **LLVM Toolset 11.0.0** - module `llvm-toolset` stream `rhel` -- **Rust Toolset 1.49.0** - module `rust-toolset` stream `rhel` -- **Go Toolset 1.15.7** - module `go-toolset` stream `rhel` - -There is new a module containing Persistent Memory Development Kit (PMDK): - -- **PMDK** - module `pmkd` stream `1_fileformat_v6` - -## Security - -- **IPsec VPN** provided by Libreswan now supports TCP encapsulation and - security labels for IKEv2. -- The **OpenSCAP** packages have been rebased to version 1.3.4, - **scap-security-guide** has been rebased to version 0.1.54. -- The **fapolicyd** framework now provides integrity checking, and the - RPM plugin now registers any system update handled by either the - YUM package manager or the RPM Package Manager. - -## General updates and improvements - -- EuroLinux 8.4 offers now **Subversion 1.14**. It's packed as the module - `subversion` with stream 1.14. The 1.10 stream remain the default module that - contains this package. -- New module `eclipse`. This module has Eclipse IDE but is commonly used - to build Java related packages. -- The *nmstate* packages provide a library and the *nmstatectl* command-line - utility to manage host network settings declaratively. Nmstate is a - network API for hosts and is fully supported in EuroLinux 8.4. The Multi-protocol - Label Switching (MPLS) is an in-kernel data-forwarding mechanism to route - traffic flow across enterprise networks. -- The *iproute2* utility introduces three new traffic control actions. -- EuroLinux 8 kernel now uses **proactive compaction** that regularly - initiates memory compaction work before a request for an allocation is made. - Therefore, **latency for specific memory allocation requests is lowered**. -- EuroLinux 8 kernel has now a new implementation of a slab memory controller - for control groups. -- EuroLinux kernel now supports the time namespace feature. It allows changing - date and time inside the Linux containers. -- EuroLinux 8 kernel now supports the Error Detection and Correction (EDAC) in - 8th and 9th generation Intel Core Processors. -- There are changes in the pacemaker resource agent - it now can detect - failures asynchronously and inject a failure into Pacemaker - immediately without waiting for the following monitor interval. - -## How to update from beta - -The beta repository has an updated package `el-release`, that contains production -repositories. Upgrading from EuroLinux 8.4 beta to 8.4 is as simple as running: - -``` -sudo yum update -y el-release -sudo yum update -y -``` - -## Branded packages - -Multiple packages have names changed due to branding, including: - -- redhat-backgrounds -> el-backgrounds -- redhat-indexhtml -> el-indexhtml -- redhat-logos -> el-logos -- redhat-logos-httpd -> el-logos-httpd -- redhat-logos-ipa -> el-logos-ipa -- redhat-release -> el-release -- redhat-release-eula -> el-release - we include EULA in release package - -All these packages have proper RPM `provides` declaration. - -The list of the packages that are changed due to branding includes, among the -others: - -- abrt -- anaconda -- anaconda-user-help -- anacondafirefox -- cloud-init -- crash -- httpd -- httpd -- initial-setup -- ipa -- liberport -- libguestfs -- libreoffice -- nginx -- opa-ff -- opa-fm -- openscap -- osinfo-db -- python3 -- redhat-rpm-config -- scap-security-guide -- skopeo -- sos -- subscription-manager -- thunderbird - - -## Batteries - -Batteries repository contains packages that are needed to rebuild distribution -but are not included in upstream repositories. Right now, this repository -contains more than 2000 packages for each buildroot. - -Multiple batteries were updated for this release there including: - -- mdds -- meson -- spirv-headers -- fontforge -- multiple python packages -- modules for bootstrapping python39 - -## Other notable changes - -- Because we changed the business model to open core, there is no longer a need - to use FBI (free base image) repositories as they are a subset of entire - repositories. FBI repos are removed from the `el-release` package. -- EuroLinux 8.4 is first version that can use `BaseOS-all`, `AppStream-all` and - `PowerTools-all` repositories that contain **all** packages produced during - build process. However, these packages are not supported by upstream or - EuroLinux. -- EuroLinux by default uses Docker Hub instead of Quay. - -## Additional resources - -- [Download EuroLinux ISO](https://fbi.cdn.euro-linux.com/isos/) -- [EuroLinux Public Request for Change and Bug Tracker](https://fbi.cdn.euro-linux.com/isos/) -- Roadmap for the project can be found in press notes available on our company - blog. [Press Notes](https://en.euro-linux.com/blog/). -- [Red Hat 8.4 - Release Notes](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/8.4_release_notes/index) - parts of our release notes are loosely based on this document. diff --git a/docs/release-notes/8.5-arm64.md b/docs/release-notes/8.5-arm64.md deleted file mode 100644 index a565d13..0000000 --- a/docs/release-notes/8.5-arm64.md +++ /dev/null @@ -1,216 +0,0 @@ -# EuroLinux 8.5 Release Notes for ARM 64 (aarch64) - -EuroLinux 8.5 is the first version of EuroLinux that provides ARM 64 General -Availability. We have to update the Gaia build system in the customers' sites -for this release. This version code name is Tirana - the capital city of -Albania. - - -Below you can find the essential changes in EuroLinux 8.5 GA release for -`aarch64` architecture from EuroLinux 8.4 Beta for ARM64. - -## Dynamic programming languages, Web and Database servers - -New versions of the following components are now available: - -- **Ruby 3.0** - module `ruby` stream 3.0. -- **nginx 1.20** - module `nginx` stream 1.20 -- **Nodejs 16** - module `nodejs` stream 16 - -## Compiler Toolset - -The following compiler toolsets have been updated in EL 8.5: - -- **GCC Toolset 11** - software collection `gcc-toolset-11` -- **LLVM Toolset 12.0.1** - module `llvm-toolset` stream `rhel` -- **Rust Toolset 1.54.0** - module `rust-toolset` stream `rhel` -- **Go Toolset 1.16.7** - module `go-toolset` stream `rhel` - -## Security - -Most of the security features are connected to rebased/updated versions -of the packages. The most crucial security changes include: - -- rsyslog - now support OpenSSL -- OpenSCAP framework - added new profiles and multiple changes and enhancements -- cryptopolicies were updated - these system-wide cryptographic policies from this - version support different policies for different backends (scoped policies) - -## High Availability and Resilient Storage - -- High Availability and Resilient Storage modules are not supported on ARM64 - architecture. This is in line with upstream policy. - -## General updates and improvements - -Among the others, the following packages were updated and enhanced: - -- NetworkManager was updated to 1.32.10 from 1.30 -- OpenIMP was updated to 2.0.31 from 2.0.29 -- acel was updated to 3.1 from 2.8 -- bluez was updated to 5.56 from 5.52 -- chrony was updated to 4.1 from 3.5 -- cockpit was updated to version 251.1 from 238.2 -- crypto-policies was updated to 20210617 from 20210209 -- dnf was updated to 4.7.0 from 4.4.2 -- elfutils were updated to 0.185 from 0.182 -- freeipmi was updated to 1.6.8 from 1.6.6 -- gnutls was updated to 3.6.16 from 3.6.14 -- ibacm was updated to 35.0 from 32.0 -- libmodulemd updated to version 2.13.0 from 2.9.4 -- libreswan was updated to version 4.4 from 4.3 -- main GCC was updated to 8.5.0 from 8.4.1 -- opencryptoki updated to version 3.16.0 from 3.15.1 -- rsyslog was updated to version 8.2102.0 from 8.1911.0 -- sssd was updated to version 2.5.2 from 2.4.0 - - -## New packages - -Among the others, the following packages were added to this release: - -- adwaita-qt5 -- ansible-collection-microsoft-sql -- ansible-collection-redhat-rhel_mgmt -- ansible-freeipa-tests -- ansible-pcp -- compact-hwloc1 -- coreos-installer -- dotnet6.0 -- eth-tools -- java-17-openjdk* -- libadwaita-qt5 -- libcap-ng-python3 -- libcomps-devel is now included in PowerTools -- libvoikko-devel - is now included in PowerTools -- mobile-broadband-provider-info-devel is now included in PowerTools -- modulemd-tools -- pcm -- python3-cloud-what -- python3-libstoragemgmt -- python3-pyghmi -- qt5-qtserialbus-devel is now included in PowerTools -- resource-agents-paf (resilient storage) -- rsyslog-openssl -- samba-vfs-iouring -- sblim-gather -- sblim-gather-provider is now included in PowerTools -- sevctl -- stratisd-dracut -- tesseract -- tss2 -- udftools -- unicode-ucd-unihan -- xapian-core and its development packages are now included - - -## How to update from beta - -The beta repository has an updated package `el-release`, that contains -production repositories. Upgrading from EuroLinux 8.4 beta for ARM64 to 8.5 GA -is as simple as running: - -``` -sudo yum update -y el-release -sudo yum update -y -``` - -## Branded packages - -Multiple packages have names changed due to branding, including: - -- redhat-backgrounds -> el-backgrounds -- redhat-indexhtml -> el-indexhtml -- redhat-logos -> el-logos -- redhat-logos-httpd -> el-logos-httpd -- redhat-logos-ipa -> el-logos-ipa -- redhat-release -> el-release -- redhat-release-eula -> el-release - we include EULA in release package - -All these packages have proper RPM `provides` declaration. - -The list of the packages that are changed due to branding includes, among the -others: - -- abrt -- anaconda -- anaconda-user-help -- anacondafirefox -- cloud-init -- crash -- httpd -- initial-setup -- ipa -- libreport -- libguestfs -- libreoffice -- nginx -- opa-ff -- opa-fm -- openscap -- osinfo-db -- python3 -- redhat-rpm-config -- scap-security-guide -- skopeo -- sos -- subscription-manager -- thunderbird - - -## Batteries - -Batteries repository contains packages that are needed to rebuild the -distribution but are not included in upstream repositories. Right now, this -repository includes more than 2100 packages for each buildroot. - - -Multiple batteries were updated for this release there, including: - -- Bootstraps for rust-toolset -- Bootstraps for go-toolset - -## Gaia build system - -Gaia build system was updated in all interested parties' environments. We had -to select/order (with current long delivery times)/install hardware for -aarch64. We also changed the rebuild policy. None of our customers was -interested in using RHEL as a buildroot for their own Enterprise Linux forks. -It means that EuroLinux must be released faster, but at the very same time, we -can exclusively focus on providing EuroLinux in the early stages and thus -release it faster. We also decided that the next version will be released -asynchronously with more batch compilation. Batch compilation is scheduled for -EuroLinux 9.0 and 8.6. - - -## Other notable changes - -- EuroLinux 8.5 is the first version that can use `baseos-all`, `appstream-all` - and `powertools-all` repositories that contain **all** packages produced - during the build process. However, these packages are not supported by upstream - or EuroLinux. They are intended for developers to build their own solutions. -- EuroLinux reverted the previous changes that made DockerHub the default - container image registry. We observed other RHEL clones and decided that - keeping default might be more suitable for users. - -## Currently missing features - -### Container and cloud images - -We will work on broader support for cloud/container images based on EuroLinux -8.5 for arm including: - -- New container images on DockerHub and Quay.io -- AWS images for Graviton processors -- New Vagrant Boxes - note that HashiCorp does not provide an aarch64 build for - Vagrant. Still, Linux distributions like Fedora delivers it so, it's achievable - and usable. - -## Additional resources - -- [Download EuroLinux ISO](https://fbi.cdn.euro-linux.com/isos/) -- [Download EuroLinux ISO secondary download](https://fbi2.cdn.euro-linux.com/isos/) -- [EuroLinux Public Request for Change and Bug Tracker](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc) -- [Red Hat 8.5 - Release Notes](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/8.5_release_notes/index) - parts of our release notes are loosely based on this document. diff --git a/docs/release-notes/8.5.md b/docs/release-notes/8.5.md deleted file mode 100644 index 8608aa6..0000000 --- a/docs/release-notes/8.5.md +++ /dev/null @@ -1,212 +0,0 @@ -# EuroLinux 8.5 Release Notes - -EuroLinux 8.5 is the first minor release created in a continuous way. It was -also the first version when we deployed our engineer to remote sites (in most -cases virtual) to provide support for organisations that rebuild RHEL/EuroLinux -from sources with Gaia build system. This version code name is Tirana - the -capital city of Albania. - - -Below you can find the essential changes in EuroLinux 8.5 release for `x86_64` -architecture. The `aarch64` GA release is slightly delayed. Release notes for -`aarch64` will be provided in a separate document. - -## Dynamic programming languages, Web and Database servers - -New versions of the following components are now available: - -- **Ruby 3.0** - module `ruby` stream 3.0. -- **nginx 1.20** - module `nginx` stream 1.20 -- **Nodejs 16** - module `nodejs` stream 16 - -## Compiler Toolset - -The following compiler toolsets have been updated in EL 8.5: - -- **GCC Toolset 11** - software collection `gcc-toolset-11` -- **LLVM Toolset 12.0.1** - module `llvm-toolset` stream `rhel` -- **Rust Toolset 1.54.0** - module `rust-toolset` stream `rhel` -- **Go Toolset 1.16.7** - module `go-toolset` stream `rhel` - -## Security - -Most of the security features are connected to rebased/updated versions -of the packages. The most crucial security changes include: - -- rsyslog - now support OpenSSL -- OpenSCAP framework - added new profiles and multiple changes and enhancements -- cryptopolicies were updated - these system-wide cryptographic policies from this - version support different policies for different backends (scoped policies) - -## High Availability and Resilient Storage - -- cmirror was updated to version 2.03.12 -- corosync was updated to version 3.1.5 -- pacemaker was updated to version 2.1.0 -- resource-agents-paf package was added to HA an RS repositories - -## General updates and improvements - -Among the others, the following packages were updated and enhanced: - -- NetworkManager was updated to 1.32.10 from 1.30 -- OpenIMP was updated to 2.0.31 from 2.0.29 -- acel was updated to 3.1 from 2.8 -- bluez was updated to 5.56 from 5.52 -- chrony was updated to 4.1 from 3.5 -- cockpit was updated to version 251.1 from 238.2 -- crypto-policies was updated to 20210617 from 20210209 -- dnf was updated to 4.7.0 from 4.4.2 -- elfutils were updated to 0.185 from 0.182 -- freeipmi was updated to 1.6.8 from 1.6.6 -- gnutls was updated to 3.6.16 from 3.6.14 -- ibacm was updated to 35.0 from 32.0 -- libmodulemd updated to version 2.13.0 from 2.9.4 -- libreswan was updated to version 4.4 from 4.3 -- main GCC was updated to 8.5.0 from 8.4.1 -- opencryptoki updated to version 3.16.0 from 3.15.1 -- rsyslog was updated to version 8.2102.0 from 8.1911.0 -- sssd was updated to version 2.5.2 from 2.4.0 - - -## New packages - -Among the others, the following packages were added to this release: - -- adwaita-qt5 -- ansible-collection-microsoft-sql -- ansible-collection-redhat-rhel_mgmt -- ansible-freeipa-tests -- ansible-pcp -- compact-hwloc1 -- coreos-installer -- dotnet-build-reference-packages -- dotnet-sdk-3.1-source-built-artifacts -- dotnet-sdk-5.0-source-built-artifacts -- dotnet5.0-build-reference-packages -- eth-tools -- flatpak (i686) included in PowerTools -- java-17-openjdk* -- libadwaita-qt5 -- libcap-ng-python3 -- libcomps-devel is now included in PowerTools -- libvoikko-devel - is now included in PowerTools -- lpsolve (i686) is now included in PowerTools -- mobile-broadband-provider-info-devel is now included in PowerTools -- modulemd-tools -- pcm -- python3-cloud-what -- python3-libstoragemgmt -- python3-pillow (i686) is now included in PowerTools -- python3-pyghmi -- qt5-qtserialbus-devel is now included in PowerTools -- resource-agents-paf (resilient storage) -- rsyslog-openssl -- samba-vfs-iouring -- sblim-gather -- sblim-gather-provider is now included in PowerTools -- sevctl -- stratisd-dracut -- tesseract -- tss2 -- udftools -- unicode-ucd-unihan -- xapian-core and its development packages are now included - - -## How to update from beta - -The beta repository has an updated package `el-release`, that contains production -repositories. Upgrading from EuroLinux 8.5 beta to 8.5 is as simple as running: - -``` -sudo yum update -y el-release -sudo yum update -y -``` - -## Branded packages - -Multiple packages have names changed due to branding, including: - -- redhat-backgrounds -> el-backgrounds -- redhat-indexhtml -> el-indexhtml -- redhat-logos -> el-logos -- redhat-logos-httpd -> el-logos-httpd -- redhat-logos-ipa -> el-logos-ipa -- redhat-release -> el-release -- redhat-release-eula -> el-release - we include EULA in release package - -All these packages have proper RPM `provides` declaration. - -The list of the packages that are changed due to branding includes, among the -others: - -- abrt -- anaconda -- anaconda-user-help -- anacondafirefox -- cloud-init -- crash -- httpd -- initial-setup -- ipa -- libreport -- libguestfs -- libreoffice -- nginx -- opa-ff -- opa-fm -- openscap -- osinfo-db -- python3 -- redhat-rpm-config -- scap-security-guide -- skopeo -- sos -- subscription-manager -- thunderbird - - -## Batteries - -Batteries repository contains packages that are needed to rebuild the -distribution but are not included in upstream repositories. Right now, this -repository includes more than 2100 packages for each buildroot. - -Multiple batteries were updated for this release there including: - -- Bootstraps for rust-toolset -- Bootstraps for go-toolset - -## Gaia build system - -Gaia build system was updated in all interested parties' environments. We also -changed the rebuild policy. None of our customers was interested in using RHEL -as a buildroot for their own Enterprise Linux forks. It means that EuroLinux -must be released faster, but at the very same time, we can exclusively focus on -providing EuroLinux in the early stages and thus release it faster. We also -decided that the next version will be released asynchronously with more batch -compilation. Synchronization was especially problematic in this release as -there was a lot of holidays in Poland. - - -## Other notable changes - -- EuroLinux 8.5 is the first version that can use `baseos-all`, `appstream-all` - and `powertools-all`,`high-availability-all`, `resilient-storage-all` - repositories that contain **all** packages produced during the build process. - However, these packages are not supported by upstream or EuroLinux. They are - intended for developers to build they own solutions. -- EuroLinux reverted the previous changes that made DockerHub the default - container image registry. We observed other RHEL clones and decided that - keeping default might be more suitable for users. - -## Additional resources - -- [Download EuroLinux ISO](https://fbi.cdn.euro-linux.com/isos/) -- [EuroLinux Public Request for Change and Bug Tracker](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc) -- A roadmap for the project can be found in press notes available on our company - blog. [EuroLinux Roadmap For Q4 2021](https://en.euro-linux.com/blog/eurolinux-roadmap-for-q4-2021/). -- [Red Hat 8.5 - Release Notes](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/8.5_release_notes/index) - parts of our release notes are loosely based on this document. diff --git a/docs/release-notes/8.6-beta.md b/docs/release-notes/8.6-beta.md deleted file mode 100644 index fdc9f87..0000000 --- a/docs/release-notes/8.6-beta.md +++ /dev/null @@ -1,250 +0,0 @@ -# EuroLinux 8.6 Beta Release Notes - -EuroLinux 8.6 is the first minor release with a full-fledged beta available -before the General Availability of the upstream version (RHEL 8.6). The Beta -version will allow releasing EuroLinux 8.6 GA faster. We decided to publish -x86_64 and corresponding x86_64, i686 open buildroots for this beta. The GA -version will release all supported arches simultaneously. - -This version’s code name is Kyiv - the capital city of Ukraine. - -## Dynamic programming languages, Web and Database servers - -New versions of the following components are now available: - -- New: **PHP 8.0** - module `php` stream `8.0` -- New: **Perl 5.32** - module `perl` stream `5.32` -- New: **Maven 3.5** - module `maven` stream `3.5` -- New: **Log4j:2** - module `log4j` stream `2` -- **PostgreSQL 10** - module `postgresql` stream `10` was rebased to PostgreSQL 10.19 from 10.17 -- **PMDK 1_fileformat_v6** - module `pmdk` stream `1_fileformat_v6` was rebased to version 1.11.1 from 1.9.2 - -## Compiler Toolset - -The following compiler toolsets have been updated in EL 8.6: - -- **Rust Toolset** - module `rust-toolset:rhel8` was updated to version 1.58.1 from 1.54.0 -- **LLVM Toolset** - module `llvm-toolset:rhel8` was updated to version 13.0.1 from 12.0.1 -- **Go Lang Toolset** - module `go-toolset:rhel8` that provides the Go Lang stack was updated to version 1.17.7 from 1.16.12 -- **GCC-Toolset-11** - toolset `gcc-toolset-11` has multiple updates and was rebased to version 11.2 - -## Containers - -- **New Containers Tools module `containers-tools` stream `4.0`** -- Containers tools module `containers-tools` stream `rhel` was heavily updated - -## Security - -Most of the security features are connected to rebased/updated versions -of the packages. The most crucial security changes include: - -- `semodule` now supports the `--checksum` option for verifying SELinux policy modules versions -- OpenSSL 3.0 support in opencryptoki, among others -- OpenSCAP supports OSBuild Blueprint as a remediation type and several command-line option improvements -- SCAP Security Guide - `authselect` for rules that harden PAM stack and more precise `xccdf_org.ssgproject.content_enable_fips_mode` rule implementation among others - -## General updates and improvements - -Among the others, the following packages were updated and enhanced: - -- Git was updated to version 2.31 from 2.27 -- 389-ds-base (Directory Server) was updated to 1.4.3.28 -- Libreswan was updated to 4.5 -- PCP was rebased to version 5.3.5-8 -- OpenSCAP was updated to 1.3.6 -- grafana and grafana containers were rebased to the newer versions -- SCAP Security Guide was updated to 0.1.60 -- authselect was updated to 1.2.2 -- bind was updated to 9.16.23 -- fapolicyd was updated to 1.1 -- libcap was updated to 2.48 -- lsvpd was updated to 1.7.13 -- opencryptoki was updated to 3.17.0 -- pcsc-lite was updated to 1.9.5 -- powerpc-utils was updated to 1.3.9 -- samba was updated to 4.15.5 - -## New packages - -Among the others, the following packages were added to `os` repository for this release: - -- aardvark-dns -- adwaita-icon-theme-devel -- ansible-core -- ansible-test -- bind9.16 -- bind9.16-chroot -- bind9.16-devel -- bind9.16-dnssec-utils -- bind9.16-doc -- bind9.16-libs -- bind9.16-license -- bind9.16-utils -- coreos-installer-dracut -- fdo-admin-cli -- fdo-client -- fdo-init -- fdo-manufacturing-server -- fdo-owner-cli -- fdo-owner-onboarding-server -- fdo-rendezvous-server -- fence-virtd-cpg -- fwupd-devel -- gdm-devel -- gdm-pam-extensions-devel -- glibc-gconv-extra -- gnome-shell-extension-classification-banner -- gnome-shell-extension-dash-to-panel -- greenboot-default-health-checks -- hostapd -- libgcab1-devel -- libguestfs-appliance -- libnbd-bash-completion -- libpinyin-devel -- libqrtr-glib -- libselinux-static -- libss-devel -- libtpms -- libtpms-devel -- libuser-devel -- libvirt-wireshark -- libxmlb-devel -- lmdb-devel -- maven-openjdk17 -- nbdkit-gzip-filter -- nbdkit-nbd-plugin -- nbdkit-tar-filter -- nbdkit-tar-plugin -- nbdkit-tmpdisk-plugin -- netavark -- NetworkManager-initscripts-updown -- nftables-devel -- nginx-mod-devel -- nmstate-devel -- nmstate-libs -- osbuild-composer-dnf-json -- osbuild-luks2 -- osbuild-lvm2 -- pcp-pmda-denki -- pcp-pmda-mongodb -- php-pecl-xdebug3 -- multiple perl-\* that are in perl 5.32 modules -- prometheus-jmx-exporter-openjdk11 -- python38-resolvelib -- python3-bind9.16 -- python3-dnf-plugin-modulesync -- qatlib-tests -- qatzip -- qatzip-devel -- qatzip-libs -- qemu-kvm-docs -- qemu-kvm-hw-usbredir -- qemu-kvm-ui-opengl -- qemu-kvm-ui-spice -- rig -- rsyslog-mmfields -- rust-std-static-wasm32-wasi -- shadow-utils-subid -- shadow-utils-subid-devel -- sshpass -- stress-ng -- swtpm -- swtpm-devel -- swtpm-libs -- swtpm-tools -- swtpm-tools-pkcs11 -- virt-v2v-bash-completion -- virt-v2v-man-pages-ja -- virt-v2v-man-pages-uk -- webrtc-audio-processing-devel -- weldr-client - - -## Branded packages - -Multiple packages have names changed due to branding, including: - -- redhat-backgrounds -> el-backgrounds -- redhat-indexhtml -> el-indexhtml -- redhat-logos -> el-logos -- redhat-logos-httpd -> el-logos-httpd -- redhat-logos-ipa -> el-logos-ipa -- redhat-release -> el-release -- redhat-release-eula -> el-release - we include EULA in release package - -All these packages have proper RPM `provides` declaration. - -The list of the packages that are changed due to branding includes, among the -others: - -- abrt -- anaconda -- anaconda-user-help -- cloud-init -- crash -- firefox -- httpd -- initial-setup -- ipa -- libguestfs -- libreoffice -- libreport -- nginx -- opa-ff -- opa-fm -- openscap -- osinfo-db -- python3 -- redhat-rpm-config -- scap-security-guide -- skopeo -- sos -- subscription-manager -- thunderbird - -## Removed packages - -The following packages were removed: - -- rhc and related packages -- insights-client and related packages - -## Batteries - -Batteries repository contains packages that are needed to rebuild the -distribution but are not included in any upstream repositories. Right now, -this repository includes more than 2500 packages for each buildroot. - -Multiple batteries were updated for this release including: - -- Bootstraps for Perl 5.32 -- Updated mesa batteries -- Smaller packages that broke buildroot - - -About 420 packages were updated for x86_64 buildroot alone. - - -## Gaia build system - -We are still working on Gaia 3.0. - -## Known bugs - -- This is a Beta release! -- openscap will probably not work -- There is ambiguity when it comes to SCAP profiles naming that will be resolved for - 8.6 GA [GitHub Bug Report](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc/issues/2) -- After installation, the first kernel might report EuroLinux 8.5 -> updated - kernel should report 8.6 beta. -- evolution-mapi was wrongly linked against older samba. The solution is `yum reinstall -y evolution-mapi` as we updated the package in-place -- dhcp-client was wrongly linked against older bind-export-libs. The solution is `yum reinstall -y dhcp-client` as we updated the package in-place - - -## Additional resources - -- [Download EuroLinux ISO](https://fbi.cdn.euro-linux.com/isos/) -- [EuroLinux Public Request for Change and Bug Tracker](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc) -- [Red Hat 8.6 Beta - Release Notes](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8-beta/html/8.6_release_notes/index) - parts of our release notes are loosely based on this document. diff --git a/docs/release-notes/8.6.md b/docs/release-notes/8.6.md deleted file mode 100644 index e1a28bd..0000000 --- a/docs/release-notes/8.6.md +++ /dev/null @@ -1,236 +0,0 @@ -# EuroLinux 8.6 Release Notes - -Since EuroLinux 8.6 was first minor release with a full-fledged beta available -before the General Availability of the upstream version (RHEL 8.6), the Beta -version allowed us to release EuroLinux 8.6 faster. - -This version’s code name is Kyiv - the capital city of Ukraine. - -## Dynamic programming languages, Web and Database servers - -New versions of the following components are now available: - -- New: **PHP 8.0** - module `php` stream `8.0` -- New: **Perl 5.32** - module `perl` stream `5.32` -- New: **Maven 3.5** - module `maven` stream `3.5` -- New: **Log4j:2** - module `log4j` stream `2` -- **PostgreSQL 10** - module `postgresql` stream `10` was rebased to PostgreSQL 10.19 from 10.17 -- **PMDK 1_fileformat_v6** - module `pmdk` stream `1_fileformat_v6` was rebased to version 1.11.1 from 1.9.2 - -## Compiler Toolset - -The following compiler toolsets have been updated in EL 8.6: - -- **Rust Toolset** - module `rust-toolset:rhel8` was updated to version 1.58.1 from 1.54.0 -- **LLVM Toolset** - module `llvm-toolset:rhel8` was updated to version 13.0.1 from 12.0.1 -- **Go Lang Toolset** - module `go-toolset:rhel8` that provides the Go Lang stack was updated to version 1.17.7 from 1.16.12 -- **GCC-Toolset-11** - toolset `gcc-toolset-11` has multiple updates and was rebased to version 11.2 - -## Containers - -- **New Containers Tools module `containers-tools` stream `4.0`** -- Containers tools module `containers-tools` stream `rhel` was heavily updated - -## Security - -Most of the security features are connected to rebased/updated versions -of the packages. The most crucial security changes include: - -- `semodule` now supports the `--checksum` option for verifying SELinux policy modules versions -- OpenSSL 3.0 support in opencryptoki, among others -- OpenSCAP supports OSBuild Blueprint as a remediation type and several command-line option improvements -- SCAP Security Guide - `authselect` for rules that harden PAM stack and more precise `xccdf_org.ssgproject.content_enable_fips_mode` rule implementation among others - -## General updates and improvements - -Among the others, the following packages were updated and enhanced: - -- Git was updated to version 2.31 from 2.27 -- 389-ds-base (Directory Server) was updated to 1.4.3.28 -- Libreswan was updated to 4.5 -- PCP was rebased to version 5.3.5-8 -- OpenSCAP was updated to 1.3.6 -- grafana and grafana containers were rebased to the newer versions -- SCAP Security Guide was updated to 0.1.60 -- authselect was updated to 1.2.2 -- bind was updated to 9.16.23 -- fapolicyd was updated to 1.1 -- libcap was updated to 2.48 -- lsvpd was updated to 1.7.13 -- opencryptoki was updated to 3.17.0 -- pcsc-lite was updated to 1.9.5 -- powerpc-utils was updated to 1.3.9 -- samba was updated to 4.15.5 - -## New packages - -Among the others, the following packages were added to `os` repository for this release: - -- aardvark-dns -- adwaita-icon-theme-devel -- ansible-core -- ansible-test -- bind9.16 -- bind9.16-chroot -- bind9.16-devel -- bind9.16-dnssec-utils -- bind9.16-doc -- bind9.16-libs -- bind9.16-license -- bind9.16-utils -- coreos-installer-dracut -- fdo-admin-cli -- fdo-client -- fdo-init -- fdo-manufacturing-server -- fdo-owner-cli -- fdo-owner-onboarding-server -- fdo-rendezvous-server -- fence-virtd-cpg -- fwupd-devel -- gdm-devel -- gdm-pam-extensions-devel -- glibc-gconv-extra -- gnome-shell-extension-classification-banner -- gnome-shell-extension-dash-to-panel -- greenboot-default-health-checks -- hostapd -- libgcab1-devel -- libguestfs-appliance -- libnbd-bash-completion -- libpinyin-devel -- libqrtr-glib -- libselinux-static -- libss-devel -- libtpms -- libtpms-devel -- libuser-devel -- libvirt-wireshark -- libxmlb-devel -- lmdb-devel -- maven-openjdk17 -- nbdkit-gzip-filter -- nbdkit-nbd-plugin -- nbdkit-tar-filter -- nbdkit-tar-plugin -- nbdkit-tmpdisk-plugin -- netavark -- NetworkManager-initscripts-updown -- nftables-devel -- nginx-mod-devel -- nmstate-devel -- nmstate-libs -- osbuild-composer-dnf-json -- osbuild-luks2 -- osbuild-lvm2 -- pcp-pmda-denki -- pcp-pmda-mongodb -- php-pecl-xdebug3 -- multiple perl-\* that are in perl 5.32 modules -- prometheus-jmx-exporter-openjdk11 -- python38-resolvelib -- python3-bind9.16 -- python3-dnf-plugin-modulesync -- qatlib-tests -- qatzip -- qatzip-devel -- qatzip-libs -- qemu-kvm-docs -- qemu-kvm-hw-usbredir -- qemu-kvm-ui-opengl -- qemu-kvm-ui-spice -- rig -- rsyslog-mmfields -- rust-std-static-wasm32-wasi -- shadow-utils-subid -- shadow-utils-subid-devel -- sshpass -- stress-ng -- swtpm -- swtpm-devel -- swtpm-libs -- swtpm-tools -- swtpm-tools-pkcs11 -- virt-v2v-bash-completion -- virt-v2v-man-pages-ja -- virt-v2v-man-pages-uk -- webrtc-audio-processing-devel -- weldr-client - - -## Branded packages - -Multiple packages have names changed due to branding, including: - -- redhat-backgrounds -> el-backgrounds -- redhat-indexhtml -> el-indexhtml -- redhat-logos -> el-logos -- redhat-logos-httpd -> el-logos-httpd -- redhat-logos-ipa -> el-logos-ipa -- redhat-release -> el-release -- redhat-release-eula -> el-release - we include EULA in release package - -All these packages have proper RPM `provides` declaration. - -The list of the packages that are changed due to branding includes, among the -others: - -- abrt -- anaconda -- anaconda-user-help -- cloud-init -- crash -- firefox -- httpd -- initial-setup -- ipa -- libguestfs -- libreoffice -- libreport -- nginx -- opa-ff -- opa-fm -- openscap -- osinfo-db -- python3 -- redhat-rpm-config -- scap-security-guide -- skopeo -- sos -- subscription-manager -- thunderbird - -## Removed packages - -The following packages were removed: - -- rhc and related packages -- insights-client and related packages - -## Batteries - -Batteries repository contains packages that are needed to rebuild the -distribution but are not included in any upstream repositories. Right now, -this repository includes more than 2500 packages for each buildroot. - -Multiple batteries were updated for this release including: - -- Bootstraps for Perl 5.32 -- Updated mesa batteries -- Smaller packages that broke buildroot - - -About 420 packages were updated for x86_64 buildroot alone. - - -## Gaia build system - -We are still working on Gaia 3.0. - -## Additional resources - -- [Download EuroLinux ISO](https://fbi.cdn.euro-linux.com/isos/), [(secondary download link)](https://fbi2.cdn.euro-linux.com/isos/) -- [EuroLinux Public Request for Change and Bug Tracker](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc) -- [Red Hat 8.6 Release - Notes](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/8.6_release_notes/index) - parts of our release notes are loosely based on this document. diff --git a/docs/release-notes/8.7-beta.md b/docs/release-notes/8.7-beta.md deleted file mode 100644 index 91a86db..0000000 --- a/docs/release-notes/8.7-beta.md +++ /dev/null @@ -1,234 +0,0 @@ -# EuroLinux 8.7 Beta Release Notes - -EuroLinux 8.7 is the first beta release for x86_64 and aarch64 beta published -concurrently. The Beta version will allow us to provide EuroLinux 8.7 faster. - -This version’s code name is Brussels - the capital city of Belgium and the -heart of European Union. - - -!!! info "Older modules removed" - In this beta we noticed that a lot of modules were obsoleted or removed, we - are waiting for GA version to confirm that there will be a mechanism that - should allow smoother migration between modules or that these modules will - be available. - -## Dynamic programming languages, Web and Database servers - -New versions of the following components are now available: - -- New: **Ruby 3.1** - module `ruby` stream `3.1` -- New: **Mercurial 6.2** - module `mercurial` stream `6.2` -- New: **Node.js 18** - module `nodejs` stream `18` -- **Redis 6** - module `redis:6` was updated from version 6.0 to 6.2.7 - -## Compiler Toolset - -The following compiler toolsets have been updated in EL 8.7: - -- New: **GCC-Toolset-12** - toolset `gcc-toolset-12` -- New: **Dotnet 7.0** - Dotnet 7.0 packages -- **Rust Toolset** - module `rust-toolset:rhel8` was updated to version 1.62.1 from 1.58.1 -- **LLVM Toolset** - module `llvm-toolset:rhel8` was updated to version 14.0.0 from 13.0.1 -- **Go Lang Toolset** - module `go-toolset:rhel8` that provides the Go Lang stack was updated to version 1.18.4 from 1.17.7 - -## Containers - -- Containers tools module `containers-tools` stream `rhel` was heavily updated -- Containers tools module `containers-tools` stream `4.0` was heavily updated -- Containers tools module `containers-tools` stream `3.0` was mostly removed -- Containers tools module `containers-tools` stream `2.0` was mostly removed - -## Security - -Most of the security features are connected to rebased/updated versions of the -packages. The most crucial security changes include: - -- **NSS no longer support RSA keys shorter than 1023 bits and won't work with such keys.** -- Updated SCAP security guilde with new `sysctl`, `pampwquality`, `grub2` rules. -- fapolicyd rebased to 1.1.3 - - -## General updates and improvements - -Among the others, the following packages were updated and enhanced: - -- QT5 toolchain and utilities were updated from 5.15.2 to 5.15.3 -- Opencryptoki was updated to version 3.18.0 from 3.17.0 -- Libva was updated to version 2.13.0 from 2.5.0 -- Chrony was updated to version 4.2 from 4.1 -- Unbound was updated to version 1.16.2 from 1.7.3 -- Fapolicyd rebased to 1.1.3 from 1.1 -- Mariadb-java-client rebased to version 2.7.1 from 2.2.5 -- open-vm-tools rebased to 12.0.5 from 11.3.5 - -## New packages - -Among the others, the following packages were added to `os` repository for this -release: - -- Multiple qt5-docs packages -- aardvark-dns -- anaconda-widgets-devel -- aspnetcore-runtime-7.0 -- aspnetcore-targeting-pack-7.0 -- dotnet-apphost-pack-7.0 -- dotnet-hostfxr-7.0 -- dotnet-sdk-7.0-source-built-artifacts -- egl-utils -- frr-selinux -- fstrm-utils -- gcc-plugin-annobin -- gcc-toolset-12 -- gcc-toolset-12-annobin-annocheck -- gcc-toolset-12-annobin-docs -- gcc-toolset-12-annobin-plugin-gcc -- gcc-toolset-12-binutils -- gcc-toolset-12-binutils-devel -- gcc-toolset-12-binutils-gold -- gcc-toolset-12-build -- gcc-toolset-12-dwz -- gcc-toolset-12-gcc -- gcc-toolset-12-gcc-c++ -- gcc-toolset-12-gcc-gfortran -- gcc-toolset-12-gcc-plugin-devel -- gcc-toolset-12-gdb -- gcc-toolset-12-libasan-devel -- gcc-toolset-12-libatomic-devel -- gcc-toolset-12-libgccjit -- gcc-toolset-12-libgccjit-devel -- gcc-toolset-12-libgccjit-docs -- gcc-toolset-12-libitm-devel -- gcc-toolset-12-liblsan-devel -- gcc-toolset-12-libstdc++-devel -- gcc-toolset-12-libstdc++-docs -- gcc-toolset-12-libtsan-devel -- gcc-toolset-12-libubsan-devel -- gcc-toolset-12-runtime -- gtk3-devel-docs -- idm-pki-acme -- idm-pki-base -- idm-pki-base-java -- idm-pki-ca -- idm-pki-kra -- idm-pki-symkey -- libasan8 -- libdhash-devel -- libestr-devel -- liblockfile -- libstoragemgmt-nfs-plugin -- libverto-libev -- make-latest (currently make43) -- make43 -- make43-devel -- open-vm-tools-salt-minion -- openslp-devel -- pam_wrapper -- poppler-qt5 -- python-ldb-devel-common -- python-sphinx-latex -- python3-babeltrace -- python3-cairo-devel -- python3-idm-pki -- python3-lasso -- python3-ldb-devel -- python3-talloc-devel -- redhat-cloud-client-configuration -- ssd-idp -- systemd-resolved **(technology preview)** -- tuned-profiles-postgresql -- xmlstarlet -- xxhash -- yara - - -## Branded packages - -Multiple packages have names changed due to branding, including: - -- redhat-backgrounds -> el-backgrounds -- redhat-indexhtml -> el-indexhtml -- redhat-logos -> el-logos -- redhat-logos-httpd -> el-logos-httpd -- redhat-logos-ipa -> el-logos-ipa -- redhat-release -> el-release -- redhat-release-eula -> el-release - we include EULA in release package - -All these packages have proper RPM `provides` declaration. - -The list of the packages that are changed due to branding includes, among the -others: - -- abrt -- anaconda -- anaconda-user-help -- cloud-init -- crash -- firefox -- httpd -- initial-setup -- ipa -- libguestfs -- libreoffice -- libreport -- nginx -- opa-ff -- opa-fm -- openscap -- osinfo-db -- python3 -- redhat-rpm-config -- scap-security-guide -- sos -- subscription-manager -- thunderbird - -## Removed packages - -The following packages were removed: - -- rhc and related packages -- insights-client and related packages - -## Maven 3.8 - -**Maven 3.8** - module `maven` stream `3.8` was not introduced in this beta. -Currently upstream didn't provide modules metadata for -javapackages-tools:202201 and javapackages-bootstrap:202201 that are required to -build Maven 3.8. The default profile for javapackages-tools:202201 is available -in the Red Hat CodeReady-Builder repository but there is no modular metadata or -RPMs. - -**We manage to create this module in not reproducible way** and in worst case -scenario we will provide specially crafted VM to build it for orgs that are -using Gaia Build System. We decided not to put this module as we are rebuilding -EuroLinux multiple times and not reproducible rebuilds are next to impossible to -maintain. - - -## Batteries - -Batteries repository contains packages that are needed to rebuild the -distribution but are not included in any upstream repositories. Right now, -this repository includes more than 2500 packages for each buildroot. - -About 30 packages were updated for x86_64 buildroot. - -## Gaia build system - -We are currently using Gaia 3.0 alpha. - -## EuroLinux 9.1 beta - -As we released a brand new EuroLinux Desktop we are working on better test -integrations with EuroLinux 9. This process takes time. We should deliver -EuroLinux 9.1 beta before EuroLinux 9.1 GA. - - -## Additional resources - -- [Download EuroLinux ISO](https://fbi.cdn.euro-linux.com/isos/), [(secondary download link)](https://fbi2.cdn.euro-linux.com/isos/) -- [EuroLinux Public Request for Change and Bug Tracker](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc) -- [Red Hat 8.7 beta Release - Notes](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8-beta/html/8.7_release_notes/index) - parts of our release notes are loosely based on this document. diff --git a/docs/release-notes/8.7.md b/docs/release-notes/8.7.md deleted file mode 100644 index 2c3254b..0000000 --- a/docs/release-notes/8.7.md +++ /dev/null @@ -1,220 +0,0 @@ -# EuroLinux 8.7 Release Notes - -This version’s code name is Brussels - the capital city of Belgium and the -heart of European Union. - -## Dynamic programming languages, Web and Database servers - -New versions of the following components are now available: - -- New: **Ruby 3.1** - module `ruby` stream `3.1` -- New: **Mercurial 6.2** - module `mercurial` stream `6.2` -- New: **Node.js 18** - module `nodejs` stream `18` -- **Redis 6** - module `redis:6` was updated from version 6.0 to 6.2.7 - -## Compiler Toolset - -The following compiler toolsets have been updated in EL 8.6: - -- New: **GCC-Toolset-12** - toolset `gcc-toolset-12` -- New: **Dotnet 7.0** - Dotnet 7.0 packages -- **Rust Toolset** - module `rust-toolset:rhel8` was updated to version 1.62.1 from 1.58.1 -- **LLVM Toolset** - module `llvm-toolset:rhel8` was updated to version 14.0.0 from 13.0.1 -- **Go Lang Toolset** - module `go-toolset:rhel8` that provides the Go Lang stack was updated to version 1.18.4 from 1.17.7 - -## Containers - -- Containers tools module `containers-tools` stream `rhel` was heavily updated -- Containers tools module `containers-tools` stream `4.0` was heavily updated - -## Security - -Most of the security features are connected to rebased/updated versions of the -packages. The most crucial security changes include: - -- **NSS no longer support RSA keys shorter than 1023 bits and won't work with such keys.** -- Updated SCAP security guilde with new `sysctl`, `pampwquality`, `grub2` rules. -- fapolicyd rebased to 1.1.3 - - -## General updates and improvements - -Among the others, the following packages were updated and enhanced: - -- QT5 toolchain and utilities were updated from 5.15.2 to 5.15.3 -- Opencryptoki was updated to version 3.18.0 from 3.17.0 -- Libva was updated to version 2.13.0 from 2.5.0 -- Chrony was updated to version 4.2 from 4.1 -- Unbound was updated to version 1.16.2 from 1.7.3 -- Fapolicyd rebased to 1.1.3 from 1.1 -- Mariadb-java-client rebased to version 2.7.1 from 2.2.5 -- open-vm-tools rebased to 12.0.5 from 11.3.5 - -## New packages - -Among the others, the following packages were added to `os` repository for this -release: - -- Multiple qt5-docs packages -- aardvark-dns -- anaconda-widgets-devel -- aspnetcore-runtime-7.0 -- aspnetcore-targeting-pack-7.0 -- dotnet-apphost-pack-7.0 -- dotnet-hostfxr-7.0 -- dotnet-sdk-7.0-source-built-artifacts -- egl-utils -- frr-selinux -- fstrm-utils -- gcc-plugin-annobin -- gcc-toolset-12 -- gcc-toolset-12-annobin-annocheck -- gcc-toolset-12-annobin-docs -- gcc-toolset-12-annobin-plugin-gcc -- gcc-toolset-12-binutils -- gcc-toolset-12-binutils-devel -- gcc-toolset-12-binutils-gold -- gcc-toolset-12-build -- gcc-toolset-12-dwz -- gcc-toolset-12-gcc -- gcc-toolset-12-gcc-c++ -- gcc-toolset-12-gcc-gfortran -- gcc-toolset-12-gcc-plugin-devel -- gcc-toolset-12-gdb -- gcc-toolset-12-libasan-devel -- gcc-toolset-12-libatomic-devel -- gcc-toolset-12-libgccjit -- gcc-toolset-12-libgccjit-devel -- gcc-toolset-12-libgccjit-docs -- gcc-toolset-12-libitm-devel -- gcc-toolset-12-liblsan-devel -- gcc-toolset-12-libstdc++-devel -- gcc-toolset-12-libstdc++-docs -- gcc-toolset-12-libtsan-devel -- gcc-toolset-12-libubsan-devel -- gcc-toolset-12-runtime -- gtk3-devel-docs -- idm-pki-acme -- idm-pki-base -- idm-pki-base-java -- idm-pki-ca -- idm-pki-kra -- idm-pki-symkey -- libasan8 -- libdhash-devel -- libestr-devel -- liblockfile -- libstoragemgmt-nfs-plugin -- libverto-libev -- make-latest (currently make43) -- make43 -- make43-devel -- open-vm-tools-salt-minion -- openslp-devel -- pam_wrapper -- poppler-qt5 -- python-ldb-devel-common -- python-sphinx-latex -- python3-babeltrace -- python3-cairo-devel -- python3-idm-pki -- python3-lasso -- python3-ldb-devel -- python3-talloc-devel -- redhat-cloud-client-configuration -- ssd-idp -- systemd-resolved **(technology preview)** -- tuned-profiles-postgresql -- xmlstarlet -- xxhash -- yara - - -## Branded packages - -Multiple packages have names changed due to branding, including: - -- redhat-backgrounds -> el-backgrounds -- redhat-indexhtml -> el-indexhtml -- redhat-logos -> el-logos -- redhat-logos-httpd -> el-logos-httpd -- redhat-logos-ipa -> el-logos-ipa -- redhat-release -> el-release -- redhat-release-eula -> el-release - we include EULA in release package - -All these packages have proper RPM `provides` declaration. - -The list of the packages that are changed due to branding includes, among the -others: - -- abrt -- anaconda -- anaconda-user-help -- cloud-init -- crash -- firefox -- httpd -- initial-setup -- ipa -- libguestfs -- libreoffice -- libreport -- nginx -- opa-ff -- opa-fm -- openscap -- osinfo-db -- python3 -- redhat-rpm-config -- scap-security-guide -- sos -- subscription-manager -- thunderbird - -## Removed packages - -The following packages were removed: - -- rhc and related packages -- insights-client and related packages - -## New vault policy - -With feedback from community we decided to add the `-last` to the EuroLinux 8.6 -vaulted versions that represents the last snapshot of the EuroLinux 8.6. More -about vault policy [here](../knowledge-base/eurolinux-vault-policy.md). - -## Smaller base repositories - -Until now we keeped all produced **versions of the same package** in base -repositories. Upstream policy is to keep only selected versions and the rest in -the vaults. It is reasonable as saves a internet bandwith, and put much less -stress on the mirroring sites. From EuroLinux 8.7 we will aim to use upstream -schema for packages. - -Older packages are still available at EuroLinux Vault. - -## Installation from baseurl with .treeinfo - -EuroLinux 8.7 is first release that officially supports the installation from -URL leveraging .treeinfo files. - -## Batteries - -Batteries repository contains packages that are needed to rebuild the -distribution but are not included in any upstream repositories. Right now, -this repository includes more than 2500 packages for each buildroot. - -About 30 packages were updated for x86_64 buildroot. - -## Gaia build system - -Gaia build system is still in the 3.0 alpha. - -## Additional resources - -- [Download EuroLinux ISO](https://fbi.cdn.euro-linux.com/isos/), [(secondary download link)](https://fbi2.cdn.euro-linux.com/isos/) -- [EuroLinux Public Request for Change and Bug Tracker](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc) -- [Red Hat 8.7 Release - Notes](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html-single/8.7_release_notes/index) - parts of our release notes are loosely based on this document. diff --git a/docs/release-notes/8.8-beta.md b/docs/release-notes/8.8-beta.md deleted file mode 100644 index ddaf0ff..0000000 --- a/docs/release-notes/8.8-beta.md +++ /dev/null @@ -1,233 +0,0 @@ -# EuroLinux 8.8 Beta Release Notes - -This version’s code name is Sofia - the capital city of Bulgaria. The Beta -version will allow us to provide EuroLinux 8.8 faster. - -Major changes in EuroLinux 8.8 Beta: - -## Dynamic programming languages, Web and Database servers - -New versions of the following components are now available: - -- New: **Python 3.11** - available as regular RPM packages -- New: **Nginx 1.22** - available as a module -- New: **PostgreSQL 15** - available as a module -- New: **Swig 4.1** - available as a module -- New: **jaxb 4** - available as a module - -The following components have been upgraded: - -- **Git** 2.39.1 -- **Git LFS** 3.2.0 - -## Updated performance monitoring tools - -The following performance monitoring tools have been updated in EuroLinux 8.8: - -- **PCP** 5.3.7 -- **Grafana** 7.5.15 - -## Kernel version - -EuroLinux 8.8 Beta is distributed with the kernel version 4.18.0-477. - -## Compilers and development tools - -The following performance tools and debuggers have been updated in EuroLinux 8.8: - -- **Valgrind** 3.19 -- **SystemTap** 4.8 -- **Dyninst** 12.1.0 -- **elfutils** 0.188 - -## Compiler Toolset - -The following compiler toolsets have been updated in EL 8.8: - -- GCC Toolset 12 -- LLVM Toolset 15.0.7 -- Rust Toolset 1.66 -- Go Toolset 1.19.4 - -## Security - -The most crucial security changes include: - -- The Libreswan IPsec implementation was rebased to version 4.9. -- Rsyslog TLS-encrypted logging now supports multiple CA files. -- The systemd-socket-proxyd service now runs in its own SELinux domain due to an update to the SELinux policy. -- The OpenSCAP security compliance utility was rebased to version 1.3.7. -- With the fapolicyd software framework, you can now filter the RPM database. - -## General updates and improvements - -- Podman now supports events for auditing. -- The Container Tools packages have been updated. -- The Aardvark and Netavark network stack now supports custom DNS server selection. -- Podman Quadlet is now available as a Technology Preview. -- The *container-tools:3.0* module stream has been deprecated. -- The CNI network stack has been deprecated. - -## New packages - -Among the others, the following packages were added to `os` repository for this -release: - -- bind9.16-dnssec-utils -- cifs-utils-devel -- ecj -- ipxe-bootimgs-aarch64 -- libnetapi -- libsndfile-utils -- libtraceevent -- libtraceevent-devel -- libtracefs -- libtracefs-devel -- libwpe -- libwpe-devel -- libxdp-devel -- libxdp-static -- lmdb -- mpdecimal -- mpdecimal++ -- mpdecimal-devel -- mpdecimal-doc -- nss_wrapper-libs -- perl-Mail-AuthenticationResults -- procps-ng-devel -- python3-bind9.16 -- python3-scour -- python3.11 -- python3.11-Cython -- python3.11-PyMySQL -- python3.11-attrs -- python3.11-cffi -- python3.11-charset-normalizer -- python3.11-cryptography -- python3.11-debug -- python3.11-devel -- python3.11-idle -- python3.11-idna -- python3.11-iniconfig -- python3.11-libs -- python3.11-lxml -- python3.11-mod_wsgi -- python3.11-numpy -- python3.11-numpy-f2py -- python3.11-packaging -- python3.11-pip -- python3.11-pip-wheel -- python3.11-pluggy -- python3.11-ply -- python3.11-psycopg2 -- python3.11-psycopg2-debug -- python3.11-psycopg2-tests -- python3.11-pybind11 -- python3.11-pybind11-devel -- python3.11-pycparser -- python3.11-pyparsing -- python3.11-pysocks -- python3.11-pytest -- python3.11-pyyaml -- python3.11-requests -- python3.11-rpm-macros -- python3.11-scipy -- python3.11-semantic_version -- python3.11-setuptools -- python3.11-setuptools-rust -- python3.11-setuptools-wheel -- python3.11-six -- python3.11-test -- python3.11-tkinter -- python3.11-urllib3 -- python3.11-wheel -- python3.11-wheel-wheel -- rtla -- samba-dc-libs -- samba-dcerpc -- texlive-translator -- tomcat -- tomcat-admin-webapps -- tomcat-docs-webapp -- tomcat-el-3.0-api -- tomcat-jsp-2.3-api -- tomcat-lib -- tomcat-servlet-4.0-api -- tomcat-webapps -- tpm2-pkcs11 -- tpm2-pkcs11-tools -- wpebackend-fdo -- wpebackend-fdo-devel - -## Branded packages - -Multiple packages have names changed due to branding, including: - -- redhat-backgrounds -> el-backgrounds -- redhat-indexhtml -> el-indexhtml -- redhat-logos -> el-logos -- redhat-logos-httpd -> el-logos-httpd -- redhat-logos-ipa -> el-logos-ipa -- redhat-release -> el-release -- redhat-release-eula -> el-release - we include EULA in release package - -All these packages have proper RPM `provides` declaration. - -The list of the packages that are changed due to branding includes, among others: - -- abrt -- anaconda -- anaconda-user-help -- cloud-init -- crash -- firefox -- httpd -- initial-setup -- ipa -- libguestfs -- libreoffice -- libreport -- nginx -- opa-ff -- opa-fm -- openscap -- osinfo-db -- python3 -- redhat-rpm-config -- scap-security-guide -- sos -- subscription-manager -- thunderbird - -## Removed packages - -The following packages were removed: - -- rhc and related packages -- insights-client and related packages - -## Batteries - -Batteries repository contains packages that are needed to rebuild the -distribution but are not included in any upstream repositories. Right now, -this repository includes more than 3000 packages for each buildroot. - -About 150 packages were updated for x86_64 buildroot alone. We also added some -of the packages (like python3.11 for i686) to the publicly available **open -buildroots**. - -## Known issues - -- Due to compose error LibreOffice is available in the older version than one - available in the RHEL 8.8 beta. The new version will land in main repos shortly. - -## Gaia build system - -We are currently using Gaia 3.0 beta. - -## Additional resources - -- [Download EuroLinux ISO](https://fbi.cdn.euro-linux.com/isos/beta) -- [EuroLinux Public Request for Change and Bug Tracker](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc) -- [Red Hat 8.8 beta Release - Notes](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8-beta/html/8.8_release_notes/index) (parts of our release notes are loosely based on this document). diff --git a/docs/release-notes/8.8.md b/docs/release-notes/8.8.md deleted file mode 100644 index bf55cdf..0000000 --- a/docs/release-notes/8.8.md +++ /dev/null @@ -1,233 +0,0 @@ -# EuroLinux 8.8 Release Notes - -This version’s code name is Sofia - the capital city of Bulgaria. - -Major changes in EuroLinux 8.8: - -## Dynamic programming languages, Web and Database servers - -New versions of the following components are now available: - -- New: **Python 3.11** - available as regular RPM packages -- New: **Nginx 1.22** - available as a module -- New: **PostgreSQL 15** - available as a module -- New: **Swig 4.1** - available as a module -- New: **jaxb 4** - available as a module - -The following components have been upgraded: - -- **Git** 2.39.1 -- **Git LFS** 3.2.0 - -## Updated performance monitoring tools - -The following performance monitoring tools have been updated in EuroLinux 8.8: - -- **PCP** 5.3.7 -- **Grafana** 7.5.15 - -## Kernel version - -EuroLinux 8.8 is distributed with the kernel version 4.18.0-477. - -## Compilers and development tools - -The following performance tools and debuggers have been updated in EuroLinux 8.8: - -- **Valgrind** 3.19 -- **SystemTap** 4.8 -- **Dyninst** 12.1.0 -- **elfutils** 0.188 - -## Compiler Toolset - -The following compiler toolsets have been updated in EL 8.8: - -- GCC Toolset 12 -- LLVM Toolset 15.0.7 -- Rust Toolset 1.66 -- Go Toolset 1.19.4 - -## Security - -The most crucial security changes include: - -- The Libreswan IPsec implementation was rebased to version 4.9. -- Rsyslog TLS-encrypted logging now supports multiple CA files. -- The systemd-socket-proxyd service now runs in its own SELinux domain due to an update to the SELinux policy. -- The OpenSCAP security compliance utility was rebased to version 1.3.7. -- With the fapolicyd software framework, you can now filter the RPM database. - -## General updates and improvements - -- Podman now supports events for auditing. -- The Container Tools packages have been updated. -- The Aardvark and Netavark network stack now supports custom DNS server selection. -- Podman Quadlet is now available as a Technology Preview. -- The *container-tools:3.0* module stream has been deprecated. -- The CNI network stack has been deprecated. - -## New packages - -Among the others, the following packages were added to `os` repository for this -release: - -- bind9.16-dnssec-utils -- cifs-utils-devel -- ecj -- ipxe-bootimgs-aarch64 -- libnetapi -- libsndfile-utils -- libtraceevent -- libtraceevent-devel -- libtracefs -- libtracefs-devel -- libwpe -- libwpe-devel -- libxdp-devel -- libxdp-static -- lmdb -- mpdecimal -- mpdecimal++ -- mpdecimal-devel -- mpdecimal-doc -- nss_wrapper-libs -- perl-Mail-AuthenticationResults -- procps-ng-devel -- python3-bind9.16 -- python3-scour -- python3.11 -- python3.11-Cython -- python3.11-PyMySQL -- python3.11-attrs -- python3.11-cffi -- python3.11-charset-normalizer -- python3.11-cryptography -- python3.11-debug -- python3.11-devel -- python3.11-idle -- python3.11-idna -- python3.11-iniconfig -- python3.11-libs -- python3.11-lxml -- python3.11-mod_wsgi -- python3.11-numpy -- python3.11-numpy-f2py -- python3.11-packaging -- python3.11-pip -- python3.11-pip-wheel -- python3.11-pluggy -- python3.11-ply -- python3.11-psycopg2 -- python3.11-psycopg2-debug -- python3.11-psycopg2-tests -- python3.11-pybind11 -- python3.11-pybind11-devel -- python3.11-pycparser -- python3.11-pyparsing -- python3.11-pysocks -- python3.11-pytest -- python3.11-pyyaml -- python3.11-requests -- python3.11-rpm-macros -- python3.11-scipy -- python3.11-semantic_version -- python3.11-setuptools -- python3.11-setuptools-rust -- python3.11-setuptools-wheel -- python3.11-six -- python3.11-test -- python3.11-tkinter -- python3.11-urllib3 -- python3.11-wheel -- python3.11-wheel-wheel -- rtla -- samba-dc-libs -- samba-dcerpc -- texlive-translator -- tomcat -- tomcat-admin-webapps -- tomcat-docs-webapp -- tomcat-el-3.0-api -- tomcat-jsp-2.3-api -- tomcat-lib -- tomcat-servlet-4.0-api -- tomcat-webapps -- tpm2-pkcs11 -- tpm2-pkcs11-tools -- wpebackend-fdo -- wpebackend-fdo-devel - -## Branded packages - -Multiple packages have names changed due to branding, including: - -- redhat-backgrounds -> el-backgrounds -- redhat-indexhtml -> el-indexhtml -- redhat-logos -> el-logos -- redhat-logos-httpd -> el-logos-httpd -- redhat-logos-ipa -> el-logos-ipa -- redhat-release -> el-release -- redhat-release-eula -> el-release - we include EULA in release package - -All these packages have proper RPM `provides` declaration. - -The list of the packages that are changed due to branding includes, among others: - -- abrt -- anaconda -- anaconda-user-help -- cloud-init -- crash -- firefox -- httpd -- initial-setup -- ipa -- libguestfs -- libreoffice -- libreport -- nginx -- opa-ff -- opa-fm -- openscap -- osinfo-db -- python3 -- redhat-rpm-config -- scap-security-guide -- sos -- subscription-manager -- thunderbird - -## Removed packages - -The following packages were removed: - -- rhc and related packages -- insights-client and related packages - -## Batteries - -Batteries repository contains packages that are needed to rebuild the -distribution but are not included in any upstream repositories. Right now, -this repository includes more than 3000 packages for each buildroot. - -About 150 packages were updated for x86_64 buildroot alone. We also added some -of the packages (like python3.11 for i686) to the publicly available **open -buildroots**. - -## Known issues - -- Java packages requires build with portable java version. We need a little bit more time - to compile it in reproducible manner. - -## Gaia build system - -We are currently using Gaia 3.0 beta. - -## Additional resources - -- [Download EuroLinux ISO](https://fbi.cdn.euro-linux.com/isos) -- [EuroLinux Public Request for Change and Bug Tracker](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc) -- [Red Hat 8.8 Release Notes](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/8.8_release_notes/index) - this is expected link to final Red Hat release notes. As we release our notes - before Red Hat this link in moment of publication might be dead. diff --git a/docs/release-notes/8.9-beta.md b/docs/release-notes/8.9-beta.md deleted file mode 100644 index 2b1669f..0000000 --- a/docs/release-notes/8.9-beta.md +++ /dev/null @@ -1,190 +0,0 @@ -# EuroLinux 8.9 Beta Release Notes - -This version’s code name is Monako - a sovereign city-state in France. The Beta -version will allow us to provide EuroLinux 8.9 safer and faster. - -Major changes in EuroLinux 8.9 Beta: - -## Kernel version - -EuroLinux 8.9 Beta is distributed with the kernel version 4.18.0-513. - -## New versions - Programming languages, Web and Database servers - -New versions of the following components are now available: - -- New: **NodeJS 20** - available as a module -- New: **GCC Toolset 13** - availabile as a software collection -- New: **Java-21-OpenJDK** - available as rpms - -## Compilers and development tools - -The following performance tools and debuggers have been updated in EuroLinux 8.9 beta: - -- **Valgrind** 3.21 from 3.19 -- **SystemTap** 4.9 from 4.8 -- **elfutils** 0.189 from 0.188 - -## Compiler Toolset - -The following compiler toolsets have been updated in EL 8.9 beta: - -- LLVM Toolset 16.0.6 - from 15.0.7 -- Rust Toolset 1.71.1 from 1.66 -- Go Toolset 1.20.6 from 1.19.4 - -## Updated performance monitoring tools - -The following performance monitoring tools have been updated in EuroLinux 8.9: - -- **Grafana** 9.2.10 - -## Security - -The most crucial security changes include: - -- Kernel 4.18.0-513.1.1 support AutoIRBS. -- OpenSCAP rebased to 1.3.8 -- SCAP ANSSI-BP-028 security profiles updated to version 2.0 -- Perl module HTTP::Tiny verifies SSL/TLS certificate by default. - -## General updates and improvements - -- Postfix now supports SRV DNS records. -- iproute updated to version 6.2.0 -- sos updated to version 4.6 - -## New packages - -Among the others, the following packages were added to `os` repositories for this -release: - -- avahi-tools -- gcc-toolset-13 -- gcc-toolset-13-annobin-annocheck -- gcc-toolset-13-annobin-docs -- gcc-toolset-13-annobin-plugin-gcc -- gcc-toolset-13-binutils -- gcc-toolset-13-binutils-devel -- gcc-toolset-13-binutils-gold -- gcc-toolset-13-dwz -- gcc-toolset-13-gcc -- gcc-toolset-13-gcc-c++ -- gcc-toolset-13-gcc-gfortran -- gcc-toolset-13-gcc-plugin-annobin -- gcc-toolset-13-gcc-plugin-devel -- gcc-toolset-13-gdb -- gcc-toolset-13-libasan-devel -- gcc-toolset-13-libatomic-devel -- gcc-toolset-13-libgccjit -- gcc-toolset-13-libgccjit-devel -- gcc-toolset-13-libitm-devel -- gcc-toolset-13-liblsan-devel -- gcc-toolset-13-libquadmath-devel -- gcc-toolset-13-libstdc++-devel -- gcc-toolset-13-libstdc++-docs -- gcc-toolset-13-libtsan-devel -- gcc-toolset-13-libubsan-devel -- gcc-toolset-13-offload-nvptx -- gcc-toolset-13-runtime -- gtk-vnc2-devel -- gvnc-devel -- java-21-openjdk -- java-21-openjdk-demo -- java-21-openjdk-demo-fastdebug -- java-21-openjdk-demo-slowdebug -- java-21-openjdk-devel -- java-21-openjdk-devel-fastdebug -- java-21-openjdk-devel-slowdebug -- java-21-openjdk-fastdebug -- java-21-openjdk-headless -- java-21-openjdk-headless-fastdebug -- java-21-openjdk-headless-slowdebug -- java-21-openjdk-javadoc -- java-21-openjdk-javadoc-zip -- java-21-openjdk-jmods -- java-21-openjdk-jmods-fastdebug -- java-21-openjdk-jmods-slowdebug -- java-21-openjdk-slowdebug -- java-21-openjdk-src -- java-21-openjdk-src-fastdebug -- java-21-openjdk-src-slowdebug -- java-21-openjdk-static-libs -- java-21-openjdk-static-libs-fastdebug -- java-21-openjdk-static-libs-slowdebug -- libvma-utils -- marisa-devel -- python3-tomli -- unifdef - -## Branded packages - -Multiple packages have names changed due to branding, including: - -- redhat-backgrounds -> el-backgrounds -- redhat-indexhtml -> el-indexhtml -- redhat-logos -> el-logos -- redhat-logos-httpd -> el-logos-httpd -- redhat-logos-ipa -> el-logos-ipa -- redhat-release -> el-release -- redhat-release-eula -> el-release - we include EULA in release package - -All these packages have proper RPM `provides` declaration. - -The list of the packages that are changed due to branding includes, among others: - -- abrt -- anaconda -- anaconda-user-help -- cloud-init -- crash -- firefox -- httpd -- initial-setup -- ipa -- libguestfs -- libreoffice -- libreport -- nginx -- opa-ff -- opa-fm -- openscap -- osinfo-db -- python3 -- redhat-rpm-config -- scap-security-guide -- sos -- subscription-manager -- thunderbird - -## Removed packages - -The following packages were removed: - -- rhc and related packages -- insights-client and related packages - -## Batteries - -Batteries repository contains packages that are needed to rebuild the -distribution but are not included in any upstream repositories. Right now, -this repository includes more than 3000 packages for each buildroot. - -About 50 packages were updated for x86_64 buildroot alone. We also added some -of the packages (like python3.11 for i686) to the publicly available **open -buildroots**. - -## Known issues - -- No known issues. - -## Gaia build system - -We are currently using Gaia 3.0 and preparing 4.0 with branding kit. - -## Additional resources - -- [Download EuroLinux ISO](https://fbi.cdn.euro-linux.com/isos/beta) -- [EuroLinux Public Request for Change and Bug Tracker](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc) -- [Red Hat 8.9 beta Release - Notes](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8-beta/html/8.9_release_notes/index) (parts of our release notes are loosely based on this document). diff --git a/docs/release-notes/8.9.md b/docs/release-notes/8.9.md deleted file mode 100644 index c249e33..0000000 --- a/docs/release-notes/8.9.md +++ /dev/null @@ -1,196 +0,0 @@ -# EuroLinux 8.9 Release Notes - -This version’s code name is Monako - a sovereign city-state in France. - - -Major changes in EuroLinux 8.9: - -## Kernel version - -EuroLinux 8.9 is distributed with the kernel version 4.18.0-513. - -## New versions - Programming languages, Web and Database servers - -New versions of the following components are now available: - -- New: **NodeJS 20** - available as a module -- New: **GCC Toolset 13** - availabile as a software collection -- New: **Java-21-OpenJDK** - available as rpms - -## Compilers and development tools - -The following performance tools and debuggers have been updated in EuroLinux 8.9: - -- **Valgrind** 3.21 from 3.19 -- **SystemTap** 4.9 from 4.8 -- **elfutils** 0.189 from 0.188 - -## Compiler Toolset - -The following compiler toolsets have been updated in EL 8.9: - -- LLVM Toolset 16.0.6 - from 15.0.7 -- Rust Toolset 1.71.1 from 1.66 -- Go Toolset 1.20.6 from 1.19.4 - -## Updated performance monitoring tools - -The following performance monitoring tools have been updated in EuroLinux 8.9: - -- **Grafana** 9.2.10 - -## Security - -The most crucial security changes include: - -- Kernel 4.18.0-513.1.1 support AutoIRBS. -- OpenSCAP rebased to 1.3.8 -- SCAP ANSSI-BP-028 security profiles updated to version 2.0 -- Perl module HTTP::Tiny verifies SSL/TLS certificate by default. - -## General updates and improvements - -- Postfix now supports SRV DNS records. -- iproute updated to version 6.2.0 -- sos updated to version 4.6 - -## New packages - -Among the others, the following packages were added to `os` repositories for this -release: - -- avahi-tools -- gcc-toolset-13 -- gcc-toolset-13-annobin-annocheck -- gcc-toolset-13-annobin-docs -- gcc-toolset-13-annobin-plugin-gcc -- gcc-toolset-13-binutils -- gcc-toolset-13-binutils-devel -- gcc-toolset-13-binutils-gold -- gcc-toolset-13-dwz -- gcc-toolset-13-gcc -- gcc-toolset-13-gcc-c++ -- gcc-toolset-13-gcc-gfortran -- gcc-toolset-13-gcc-plugin-annobin -- gcc-toolset-13-gcc-plugin-devel -- gcc-toolset-13-gdb -- gcc-toolset-13-libasan-devel -- gcc-toolset-13-libatomic-devel -- gcc-toolset-13-libgccjit -- gcc-toolset-13-libgccjit-devel -- gcc-toolset-13-libitm-devel -- gcc-toolset-13-liblsan-devel -- gcc-toolset-13-libquadmath-devel -- gcc-toolset-13-libstdc++-devel -- gcc-toolset-13-libstdc++-docs -- gcc-toolset-13-libtsan-devel -- gcc-toolset-13-libubsan-devel -- gcc-toolset-13-offload-nvptx -- gcc-toolset-13-runtime -- gtk-vnc2-devel -- gvnc-devel -- java-21-openjdk -- java-21-openjdk-demo -- java-21-openjdk-demo-fastdebug -- java-21-openjdk-demo-slowdebug -- java-21-openjdk-devel -- java-21-openjdk-devel-fastdebug -- java-21-openjdk-devel-slowdebug -- java-21-openjdk-fastdebug -- java-21-openjdk-headless -- java-21-openjdk-headless-fastdebug -- java-21-openjdk-headless-slowdebug -- java-21-openjdk-javadoc -- java-21-openjdk-javadoc-zip -- java-21-openjdk-jmods -- java-21-openjdk-jmods-fastdebug -- java-21-openjdk-jmods-slowdebug -- java-21-openjdk-slowdebug -- java-21-openjdk-src -- java-21-openjdk-src-fastdebug -- java-21-openjdk-src-slowdebug -- java-21-openjdk-static-libs -- java-21-openjdk-static-libs-fastdebug -- java-21-openjdk-static-libs-slowdebug -- kmod-redhat-ahci -- libvma-utils -- marisa-devel -- python3-tomli -- unifdef - -## Branded packages - -Multiple packages have names changed due to branding, including: - -- redhat-backgrounds -> el-backgrounds -- redhat-indexhtml -> el-indexhtml -- redhat-logos -> el-logos -- redhat-logos-httpd -> el-logos-httpd -- redhat-logos-ipa -> el-logos-ipa -- redhat-release -> el-release -- redhat-release-eula -> el-release - we include EULA in release package - -All these packages have proper RPM `provides` declaration. - -The list of the packages that are changed due to branding includes, among others: - -- abrt -- anaconda -- anaconda-user-help -- cloud-init -- crash -- firefox -- httpd -- initial-setup -- ipa -- libguestfs -- libreoffice -- libreport -- nginx -- opa-ff -- opa-fm -- openscap -- osinfo-db -- python3 -- redhat-rpm-config -- scap-security-guide -- sos -- subscription-manager -- thunderbird - -## Removed packages - -The following packages were removed: - -- rhc and related packages -- insights-client and related packages - -## Batteries - -Batteries repository contains packages that are needed to rebuild the -distribution but are not included in any upstream repositories. Right now, -this repository includes more than 3000 packages for each buildroot. - -About 50 packages were updated for x86_64 buildroot alone. We also added some -of the packages (like python3.11 for i686) to the publicly available **open -buildroots**. - -## Known issues - -- The AppStream is is about 15GiB. After long discussion and feedback we - decided to keep it RHEL like way, where AppStream ISO is so full because it - can be used to mount repositories used for mirroring and system. We are - sorry but current state (mostly modularity) make things extremely hard to - manage without breaking user experience. -- There is huge problem with packages of java-21 not being reproducible. - -## Gaia build system - -We are currently using Gaia 3.0 and preparing 4.0 with branding kit. - -## Additional resources - -- [Download EuroLinux ISO](https://fbi.cdn.euro-linux.com/isos/) -- [EuroLinux Public Request for Change and Bug Tracker](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc) -- [Red Hat 8.9 Release - Notes](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/8.9_release_notes/index) (parts of our release notes are loosely based on this document). diff --git a/docs/release-notes/9.0-beta.md b/docs/release-notes/9.0-beta.md deleted file mode 100644 index 00151c6..0000000 --- a/docs/release-notes/9.0-beta.md +++ /dev/null @@ -1,221 +0,0 @@ -# EuroLinux 9 Beta Release Notes - -## Technical changes between EuroLinux 9 and 8 - -### Installer and image creation - -In EuroLinux 9.0 you can now use a standalone smart card to both authenticate -yourself and gain additional privileges via `sudo`. - -For the typical cases of installing EuroLinux with a medium such as a disk -interactively a Quality of Life tweak has been implemented: the Anaconda -installer will now automatically activate a network connection if applicable -(will try to obtain an address via DHCP). - -You can now optionally permit a password-based root login via SSH or completely -lock the root account in any case. (While the former is not recommended due to -security and disabled in EuroLinux 9 by default, there are valid use cases -which we support with this single easy switch) - -### Administrative tools - -If you want to rename a network interface, it is recommended that you use -systemd link files. Check `man 5 systemd.link` for more information. - -Alternatively udev rules may be used. If you need to use the `ifcfg` tool, -please install the `initscripts` package first since it is not installed by -default. - -### Security - -EuroLinux 9 provides OpenSSL version 3.0.0. Among other things, the concept of -*providers* has been added, which means that different programs can use -different security algorithms depending on their needs. You can imagine a -situation where you have implemented solutions where one needs to use FIPS -mode, while others need to maintain compliance with less secure policies. - -This new version comes with a few security-related implications. The `TLS-1.3` -protocol requires that a `PKCS#11` token supports `raw RSA` or `RSA-PSS` -signatures. - -If this is applicable to your scenario, please configure your software to use -TLS up to `TLS-1.2`. Additionally please edit the file -`/etc/pki/tls/openssl.cnf` and add this snippet at the very end of the -`[ crypto_policy ]` section: - -``` -SignatureAlgorithms = RSA+SHA256:RSA+SHA512:RSA+SHA384:ECDSA+SHA256:ECDSA+SHA512:ECDSA+SHA384 -MaxProtocol = TLSv1.2 -``` - -### Developer tools - -Some of the newest and most reliable technology stacks for developers are -available in the repositories. These include: - -- Ant 1.10 -- GCC 11.2 -- Git 2.31 -- Go 1.17.5 -- LLVM 13 -- Maven 3.6.3 -- NodeJS 16 -- OpenJDK 17.0.1 -- PHP 8.0 -- Perl 5.32 -- Python 3.9 -- Ruby 3.0 -- Rust 1.56 -- SVN 1.14 - -The EuroLinux 9 platform ships glibc 2.34, which will provide 10 years of -business-class stability support and the same amount of software binary -interface compatibility time. As a result, programs written today will work the -same way 10 years from now. - -### Web servers and database engines - -The following software is now available in our repositories: - -HTTP servers: - -- Apache HTTPD 2.4 -- nginx 1.20 - -Proxy servers: - -- Squid 5.1 -- Varnish Cache 6.5 - -Database engines: - -- MariaDB 10.5.12 -- MySQL 8.0 -- PostgreSQL 13 -- Redis 6.2.6 - -### Security Policies - SCAP Security Guide - -The SCAP Security Guide has been updated to version 0.1.57 and made a number of changes -from the counterpart we provide in EuroLinux 8: - -- Removed deprecated SCAP 1.2 source data streams. -- Removed Bash profile remediation scripts to encourage more secure practices. -- Although references for EuroLinux 8 have been left in place, the current - package is designed for EuroLinux 9 - please kindly use packages for older - releases if you need to check them for security policies. - -### GNOME 40 - -GNOME has been updated to GNOME 40, a major step forward from EuroLinux 8's -GNOME 3.32.2 , which includes many new features. - -GNOME 40 includes a new and improved style, including the user interface, icons -and desktop, The *Activities* look and feel provides a better experience when -working, launching applications and arranging your personal workspace - -workspaces are now arranged horizontally and the window overview and -application grid are available vertically. - -Many *Quality of Life* improvements have also been added, including: - -- running the software using a separate graphics card by right-clicking and - selecting the appropriate option -- The ability to mute notifications by selecting *Do not disturb*, which will - appear as a separate button in the notification -- Each screen can use a different refresh rate -- The *Activities* program allows you to group application icons into folders - using a *drag-and-drop* method -- provide the ability to fractionally scale the display - - -## Notable changes - -EuroLinux 9 provides refreshed and updated versions of the following packages: - -- m4 was updated from version `1.4.18` to `1.4.19` -- xdp-tools was updated from version `1.1.1` to `1.2.1` -- openchange was updated from `2.3` (version) `37` (release) to `2.3` (version) `38` (release) -- tigervnc was updated from `1.11.0` (version) `20` (release) to `1.11.0` (version) `21` (release) - -**We expect updated versions of these packages to be available in the GA -version of RHEL.** - -## Known issues - - -- Dotnet is not available at the moment. ~~Fix will arrive next week (the first - week of march)~~ **Update: It's planned for release with ARM Beta** -- We are waiting for Secure Boot; as you can see here - https://github.com/rhboot/shim-review/issues, it is a long process -- ~~There is only minimal ISO. AppStream complete ISO be published next week (the - first week of April)~~ **Update: AppStream ISO is available.** -- SCAP is not usable. A fix will arrive with EuroLinux 9 beta for ARM64 -- Until GA we will not rebuild other Enterprise Linuxes as it is pointless -- There might be branding issues. If you find one, please create an issue in - our public bug tracker -- Migration scripts worked well in our tests. We were able to migrate from - CentOS Stream 9 and Red Hat Enterprise Linux 9 beta. Because EuroLinux 9 and - Red Hat Enterprise Linux 9 are in the beta stage, in the meantime, CentOS - Stream 9 is heavily developed. **We won't provide assistance and support for - migration until the GA of EuroLinux 9.** -- **EuroLinux 9 beta is not officially supported for production uses** -- We will update this section when fixes arrive, or new issues arise.. - -## Batteries repositories - -The battery repository is available for customers with Golden Key and Gaia -subscriptions. There are about 1000 packages that are not part of any build (so -they are not included in EuroLinux Open Build roots) but are required to -rebuild EuroLinux/Custom Fork from RHEL or Eurolinux sources. - -## EuroLinux 9 for ARM - -EuroLinux for ARM will use an updated Gaia rebuild stack. We decided that this -is an ideal testbed because ARM64 is not as popular as x86_64 architecture. It -also allowed us to create x86_64, open build roots for i686 and x86_64 and -batteries repos faster. Because creating EuroLinux 9 beta took us about four -weeks, ARM should take about two weeks, after updating Gaia Stack, as we have -all the necessary batteries and build orders figured out. - -## Gaia updates - -New Gaia used to rebuild EuroLinux 9 for ARM64 is even more distributed. - -There are new commands in Gaia: - -- new automodule-update Gaia subcommand, that well - automatically updates - modules. No more manual config changes for modules -- new automodule-merge Gaia subcommand. This command uses multiple input files - (RH/EuroLinux modules files + result build + custom files) to create an updated - module definition - -Other notable changes: - -- Striga now creates `automodule-*` commands -- Striga can create `--partial` commands for module rebuild -- Vardoger now supports config files that allows ignoring chosen tests/levels - for selected RPMs -- A lot of new configs for EuroLinux 9 - - -We will also update hardware requirements for rebuild, including reference -build servers for ARM and PowerPC. The rebuilds will start with the release of -EuroLinux 9. It will also require updated infrastructure. - -## Container and cloud images - -You can use the following publicly available images for EuroLinux 9 beta - -- [EuroLinux 9 Beta Vagrant Boxes (libvirt/VMware Workstation/VirtualBox) ](https://app.vagrantup.com/eurolinux-vagrant/boxes/eurolinux-9) -- [EuroLinux 9 Beta Container on the Docker Hub](https://hub.docker.com/r/eurolinux/eurolinux-9) -- [EuroLinux 9 Beta Container on the Quay.io](https://quay.io/repository/eurolinux/eurolinux-9) - -## Additional resources - -- [Download EuroLinux ISO](https://fbi.cdn.euro-linux.com/isos/) -- [Download EuroLinux ISO secondary download](https://fbi2.cdn.euro-linux.com/isos/) -- [EuroLinux universal migration scripts](https://github.com/EuroLinux/eurolinux-migration-scripts) -- [EuroLinux Public Request for Change and Bug Tracker](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc) -- [Red Hat 9.0 beta - Release Notes](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9-beta/html/9.0_release_notes/index) - parts of our release notes are loosely based on this document. diff --git a/docs/release-notes/9.0.md b/docs/release-notes/9.0.md deleted file mode 100644 index 9b9a383..0000000 --- a/docs/release-notes/9.0.md +++ /dev/null @@ -1,204 +0,0 @@ -# EuroLinux 9 Release Notes - -## Technical changes between EuroLinux 9 and 8 - -### Installer and image creation - -In EuroLinux 9.0 you can now use a standalone smart card to both authenticate -yourself and gain additional privileges via `sudo`. - -For the typical cases of installing EuroLinux with a medium such as a disk -interactively a Quality of Life tweak has been implemented: the Anaconda -installer will now automatically activate a network connection if applicable -(will try to obtain an address via DHCP). - -You can now optionally permit a password-based root login via SSH or completely -lock the root account in any case. (While the former is not recommended due to -security and disabled in EuroLinux 9 by default, there are valid use cases -which we support with this single easy switch) - -### Administrative tools - -If you want to rename a network interface, it is recommended that you use -systemd link files. Check `man 5 systemd.link` for more information. - -Alternatively udev rules may be used. If you need to use the `ifcfg` tool, -please install the `initscripts` package first since it is not installed by -default. - -### Security - -EuroLinux 9 provides OpenSSL version 3.0.0. Among other things, the concept of -*providers* has been added, which means that different programs can use -different security algorithms depending on their needs. You can imagine a -situation where you have implemented solutions where one needs to use FIPS -mode, while others need to maintain compliance with less secure policies. - -This new version comes with a few security-related implications. The `TLS-1.3` -protocol requires that a `PKCS#11` token supports `raw RSA` or `RSA-PSS` -signatures. - -If this is applicable to your scenario, please configure your software to use -TLS up to `TLS-1.2`. Additionally please edit the file -`/etc/pki/tls/openssl.cnf` and add this snippet at the very end of the -`[ crypto_policy ]` section: - -``` -SignatureAlgorithms = RSA+SHA256:RSA+SHA512:RSA+SHA384:ECDSA+SHA256:ECDSA+SHA512:ECDSA+SHA384 -MaxProtocol = TLSv1.2 -``` - -### Developer tools - -Some of the newest and most reliable technology stacks for developers are -available in the repositories. These include: - -- Ant 1.10 -- GCC 11.2 -- Git 2.31 -- Go 1.17.5 -- LLVM 13 -- Maven 3.6.3 -- NodeJS 16 -- OpenJDK 17.0.1 -- PHP 8.0 -- Perl 5.32 -- Python 3.9 -- Ruby 3.0 -- Rust 1.56 -- SVN 1.14 - -The EuroLinux 9 platform ships glibc 2.34, which will provide 10 years of -business-class stability support and the same amount of software binary -interface compatibility time. As a result, programs written today will work the -same way 10 years from now. - -### Web servers and database engines - -The following software is now available in our repositories: - -HTTP servers: - -- Apache HTTPD 2.4 -- nginx 1.20 - -Proxy servers: - -- Squid 5.1 -- Varnish Cache 6.5 - -Database engines: - -- MariaDB 10.5.12 -- MySQL 8.0 -- PostgreSQL 13 -- Redis 6.2.6 - -### Security Policies - SCAP Security Guide - -The SCAP Security Guide has been updated to version 0.1.57 and made a number of changes -from the counterpart we provide in EuroLinux 8: - -- Removed deprecated SCAP 1.2 source data streams. -- Removed Bash profile remediation scripts to encourage more secure practices. -- Although references for EuroLinux 8 have been left in place, the current - package is designed for EuroLinux 9 - please kindly use packages for older - releases if you need to check them for security policies. - -### GNOME 40 - -GNOME has been updated to GNOME 40, a major step forward from EuroLinux 8's -GNOME 3.32.2 , which includes many new features. - -GNOME 40 includes a new and improved style, including the user interface, icons -and desktop, The *Activities* look and feel provides a better experience when -working, launching applications and arranging your personal workspace - -workspaces are now arranged horizontally and the window overview and -application grid are available vertically. - -Many *Quality of Life* improvements have also been added, including: - -- running the software using a separate graphics card by right-clicking and - selecting the appropriate option -- The ability to mute notifications by selecting *Do not disturb*, which will - appear as a separate button in the notification -- Each screen can use a different refresh rate -- The *Activities* program allows you to group application icons into folders - using a *drag-and-drop* method -- provide the ability to fractionally scale the display - - -## Notable changes - -EuroLinux 9 provides refreshed and updated versions of the following packages: - -- m4 was updated from version `1.4.18` to `1.4.19` -- xdp-tools was updated from version `1.1.1` to `1.2.1` -- openchange was updated from `2.3` (version) `37` (release) to `2.3` (version) `38` (release) -- tigervnc was updated from `1.11.0` (version) `20` (release) to `1.11.0` (version) `21` (release) - -**We expect updated versions of these packages to be available in the GA -version of RHEL.** - -## Known issues - - -- We are waiting for Secure Boot; as you can see here - https://github.com/rhboot/shim-review/issues, it is a long process - -## Batteries repositories - -The battery repository is available for customers with Golden Key and Gaia -subscriptions. There are about 1000 packages that are not part of any build (so -they are not included in EuroLinux Open Build roots) but are required to -rebuild EuroLinux/Custom Fork from RHEL or Eurolinux sources. - -## EuroLinux 9 for ARM - -EuroLinux for ARM will use an updated Gaia rebuild stack. We decided that this -is an ideal testbed because ARM64 is not as popular as x86_64 architecture. It -also allowed us to create x86_64, open build roots for i686 and x86_64 and -batteries repos faster. - -## Gaia updates - -New Gaia used to rebuild EuroLinux 9 for ARM64 is even more distributed. - -There are new commands in Gaia: - -- new automodule-update Gaia subcommand, that well - automatically updates - modules. No more manual config changes for modules -- new automodule-merge Gaia subcommand. This command uses multiple input files - (RH/EuroLinux modules files + result build + custom files) to create an updated - module definition - -Other notable changes: - -- Striga now creates `automodule-*` commands -- Striga can create `--partial` commands for module rebuild -- Vardoger now supports config files that allows ignoring chosen tests/levels - for selected RPMs -- A lot of new configs for EuroLinux 9 - - -We will also update hardware requirements for rebuild, including reference -build servers for ARM and PowerPC. The rebuilds will start with the release of -EuroLinux 9. It will also require updated infrastructure. - -## Container and cloud images - -You can use the following publicly available images for EuroLinux 9 - -- [EuroLinux 9 Vagrant Boxes (libvirt/VMware Workstation/VirtualBox) ](https://app.vagrantup.com/eurolinux-vagrant/boxes/eurolinux-9) -- [EuroLinux 9 Container on the Docker Hub](https://hub.docker.com/r/eurolinux/eurolinux-9) -- [EuroLinux 9 Container on the Quay.io](https://quay.io/repository/eurolinux/eurolinux-9) - -## Additional resources - -- [Download EuroLinux ISO](https://fbi.cdn.euro-linux.com/isos/) -- [Download EuroLinux ISO secondary download](https://fbi2.cdn.euro-linux.com/isos/) -- [EuroLinux universal migration scripts](https://github.com/EuroLinux/eurolinux-migration-scripts) -- [EuroLinux Public Request for Change and Bug Tracker](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc) -- [Red Hat 9.0 - Release Notes](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html-single/9.0_release_notes/index) - parts of our release notes are loosely based on this document. diff --git a/docs/release-notes/9.1.md b/docs/release-notes/9.1.md deleted file mode 100644 index ea23cd0..0000000 --- a/docs/release-notes/9.1.md +++ /dev/null @@ -1,175 +0,0 @@ -# EuroLinux 9.1 Release Notes - -## Major changes in EuroLinux 9.1. - -## Installer and image creation - -Image builder on-premise now supports: - -- Uploading images to GCP. -- Customizing the /boot partition. -- Pushing a container image directly to a registry. -- Users can now customize their blueprints during the image creation process. - -Installer support customization size of the `/boot` partition. `-allow-ssh` kickstart option allows ssh login as root user. - -GRUB bootloader menu is hidden by default. - - -## Security - -EuroLinux 9.1 introduces **Keylime**, a remote machine attestation tool using the -trusted platform module (TPM) technology. With Keylime, you can verify and -continuously monitor the integrity of remote machines. - -**OpenSSH** now supports setting minimum RSA key length. The option to be set is named `RequiredRSASize`. `crypto-policies` enforce minimum 2048-bit RSA key length for OpenSSH by default. - -**NSS** no longer support RSA keys shorter than 1023bit. - -SELinux user-space packages have been upgraded to version 3.4. **Changes**: -- Improved relabeling performance through parallel relabeling -- Support for SHA-256 in the `semodule` tool -- New policy utilities in the `libsepol-utils` package - -## Command-line tools - -The following command-line tools have been updated in EuroLinux 9.1: -- `cronie`, now supports a randomized time within range `~` -- `ReaR`, now utilises new variables for executing commands before and after recovery -- `opencryptoki` to version 3.18.0 -- `lsvpd` to version 1.7.14 -- `libvpd` to version 2.2.9 -- `sysctl` supports same syntax for arguments as `systemd-sysctl` - - -EuroLinux 9.1 introduces a new package `xmlstarlet` with which you can -parse, query, validate, transform and edit XML files. - - -## Infrastructure services - -The following infrastructure services tools have been updated in EuroLinux 9.1: -- `chrony` to version 4.2 -- `unbound` to version 1.16.2 -- `frr` to version 8.2.2 -- `whois` package now provides the `/usr/bin/mkpasswd` binary, which can be used to encrypt a password with the `crypt` C library interface. - -## Networking - -NetworkManager supports migrating connection profiles from the deprecated -*ifcfg* format to keyfile format. - -The MultiPath TCP (MPTCP) code in the kernel has been updated and upstream -Linux 5.19. - -NetworkManager now clearly indicates that WEP support is not available in -EuroLinux 9. - -## Programming languages, web and database servers - -Later versions of the following components are now available as new module -streams: -- *PHP* 8.1 -- *Ruby* 3.1 -- *Node.js* 18 - -The Apache HTTP Server has been updated to version 2.4.53. - -# Compilers and development tools - -## Updated system toolchain - -The following system toolchain components have been updated in EuroLinux 9.1: -- *binutils* 2.35.2 -- *GCC* 11.2.1 -- *glibc* 2.34 - -## Updated performance tools and debuggers - -The following performance tools and debuggers have been updated in EuroLinux -9.1: -- *GDB* 10.2 -- *Valgrind* 3.19 -- *SystemTap* 4.7 -- *Dyninst* 12.1.0 -- *elfutils* 0.187 - -## Updated performance monitoring tools - -The following performance monitoring tools have been updated in EuroLinux 9.1: -- *Grafana* 7.5.13 -- *PCP* 5.3.7 - -## Updated compiler toolsets - -The following compiler toolsets have been updated in EuroLinux 9.1: -- *GCC Toolset* 12 -- *Go Toolset* 1.18 -- *Rust Toolset* 1.62 -- *LLVM Toolset* 14.0.6 - -# Java implementations in EuroLinx 9.1 - -EuroLinux 9 AppStream repository includes: -- *java-11-openjdk* - OpenJDK 11 Java Runtime Environment and the OpenJDK 11 - Java Software Development Kit. -- *java-17-openjdk* - OpenJDK 17 Java Runtime Environment and the OpenJDK 17 - Java Software Development Kit. -- *java-1.8.0-openjdk* - OpenJDK 8 Java Runtime Environment and the OpenJDK 8 - Java Software Development Kit. -- *Maven 3.8* has been added as a module stream - - -## Batteries repositories - -The battery repository is available for customers with Golden Key and Gaia -subscriptions. There are about 1000 packages that are not part of any build (so -they are not included in EuroLinux Open Build roots) but are required to -rebuild EuroLinux/Custom Fork from RHEL or Eurolinux sources. - -## EuroLinux 9 for ARM - -EuroLinux for ARM will use an updated Gaia rebuild stack. We decided that this -is an ideal testbed because ARM64 is not as popular as x86_64 architecture. It -also allowed us to create x86_64, open build roots for i686 and x86_64 and -batteries repos faster. Because creating EuroLinux 9 beta took us about four -weeks, ARM should take about two weeks, after updating Gaia Stack, as we have -all the necessary batteries and build orders figured out. - -## Gaia updates - -New Gaia used to rebuild EuroLinux 9 for ARM64 is even more distributed. - -There are new commands in Gaia: -- new automodule-update Gaia subcommand, that well - automatically updates - modules. No more manual config changes for modules -- new automodule-merge Gaia subcommand. This command uses multiple input files - (RH/EuroLinux modules files + result build + custom files) to create an updated - module definition - -Other notable changes: -- Striga now creates `automodule-*` commands -- Striga can create `--partial` commands for module rebuild -- Vardoger now supports config files that allows ignoring chosen tests/levels for selected RPMs -- A lot of new configs for EuroLinux 9 - - -We will also update hardware requirements for rebuild, including reference -build servers for ARM and PowerPC. The rebuilds will start with the release of -EuroLinux 9. It will also require updated infrastructure. - -## Container and cloud images - -You can use the following publicly available images for EuroLinux 9 beta -- [EuroLinux 9 Vagrant Boxes (libvirt/VMware Workstation/VirtualBox) ](https://app.vagrantup.com/eurolinux-vagrant/boxes/eurolinux-9) -- [EuroLinux 9 Container on the Docker Hub](https://hub.docker.com/r/eurolinux/eurolinux-9) -- [EuroLinux 9 Container on the Quay.io](https://quay.io/repository/eurolinux/eurolinux-9) - -## Additional resources - -- [Download EuroLinux ISO](https://fbi.cdn.euro-linux.com/isos/) -- [Download EuroLinux ISO secondary download](https://fbi2.cdn.euro-linux.com/isos/) -- [EuroLinux universal migration scripts](https://github.com/EuroLinux/eurolinux-migration-scripts) -- [EuroLinux Public Request for Change and Bug Tracker](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc) -- [Red Hat 9.1 Release Notes](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/9.1_release_notes/index) parts of our release notes are loosely based on this document. - diff --git a/docs/release-notes/9.2.md b/docs/release-notes/9.2.md deleted file mode 100644 index c1d1b72..0000000 --- a/docs/release-notes/9.2.md +++ /dev/null @@ -1,152 +0,0 @@ -# EuroLinux 9.2 Release Notes - -## Major changes in EuroLinux 9.2. - -## Security - -Key security-related highlights: - -- The OpenSSL secure communications library was rebased to version 3.0.7. -- SELinux user-space packages were updated to version 3.5. -- Keylime was rebased to version 6.5.2 -- OpenSCAP was rebased to version 1.3.7. -- SCAP Security Guide was rebased to version 0.1.66. -- A new rule for idle session termination was added to SCAP. -- Clevis now accepts external tokens. -- Rsyslog TLS-encrypted logging now supports multiple CA files. -- Rsyslog privileges are limited to minimize security exposure. - -## Programming languages, web and database servers - -Later versions of the following application are now available: - -- **Python** 3.11 -- **PostgreSQL** 15 -- **nginx** 1.22 - -The following components have been upgraded: - -- **Git LFS** to version 3.2.0 -- **Git** to version 2.39.1 - -## Compilers and development tools - -The following system toolchain components have been updated in EuroLinux 9.2: - -- **GCC** 11.3.1 -- **glibc** 2.34 -- **binutils** 2.35.2 - -# Updated performance tools and debuggers - -The following performance tools and debuggers have been updated in EuroLinux 9.2: - -- **elfutils** 0.188 -- **GDB** 10.2 -- **Valgrind** 3.19 -- **SystemTap** 4.8 -- **Dyninst** 12.1.0 - -## Updated performance monitoring tools - -The following performance monitoring tools have been updated in EuroLinux 9.2: - -- **PCP** 6.0.1 -- **Grafana** 9.0.9 -- Updated compiler toolsets - -The following compiler toolsets have been updated in EuroLinux 9.2: - -- **GCC Toolset** 12 -- **Go Toolset** 1.19.6 -- **LLVM Toolset** 15.0.7 -- **Rust Toolset** 1.66 - -## Installer and image creation - -Key highlights for image builder: - -- Image builder on-prem now offers a new and improved way to create blueprints - and images in the image builder web console. -- Creating customized files and directories in the /etc directory is now supported. - -## Java implementations in EuroLinux 9 - -The EuroLinux 9 AppStream repository includes: - -The ```java-11-openjdk``` packages, which provide the OpenJDK 11 Java Runtime -Environment and the OpenJDK 11 Java Software Development Kit. -The ```java-17-openjdk``` packages, which provide the OpenJDK 17 Java Runtime -Environment and the OpenJDK 17 Java Software Development Kit. -The ```java-1.8.0-openjdk packages```, which provide the OpenJDK 8 Java Runtime -Environment and the OpenJDK 8 Java Software Development Kit. - -## Containers - -Notable changes include: - -- Podman now supports events for auditing. -- Clients for sigstore signatures with Fulcio and Rekor are now available. -- Podman Quadlet is now available as a Technology Preview. -- Skopeo now supports generating sigstore key pairs. -- The Container Tools packages have been updated. -- Toolbox is now available. -- The CNI network stack has been deprecated. -- The Aardvark and Netavark networks stack now supports custom DNS server selection. - -## Known issues - -Due to changes in the build process, some java packages (```java-1.8.0-openjdk```, -```java-11-openjdk```, ```java-17-openjdk```) are not updated jet (TODO). - -## Batteries repositories - -The battery repository is available for customers with Golden Key and Gaia -subscriptions. There are about 330 packages that are not part of any build (so -they are not included in EuroLinux Open Build roots) but are required to -rebuild EuroLinux/Custom Fork from RHEL or Eurolinux sources. - -## EuroLinux 9 for ARM - -EuroLinux for ARM will use an updated Gaia rebuild stack. We decided that this -is an ideal testbed because ARM64 is not as popular as x86_64 architecture. It -also allowed us to create x86_64, open build roots for i686 and x86_64 and -batteries repos faster. Because creating EuroLinux 9 took us about four -weeks, ARM should take about two weeks, after updating Gaia Stack, as we have -all the necessary batteries and build orders figured out. - -## Gaia updates - -New Gaia used to rebuild EuroLinux 9 for ARM64 is even more distributed. - -There are new commands in Gaia: -- new automodule-update Gaia subcommand, that well - automatically updates - modules. No more manual config changes for modules -- new automodule-merge Gaia subcommand. This command uses multiple input files - (RH/EuroLinux modules files + result build + custom files) to create an updated - module definition - -Other notable changes: -- Striga now creates `automodule-*` commands -- Striga can create `--partial` commands for module rebuild -- Vardoger now supports config files that allows ignoring chosen tests/levels for selected RPMs -- A lot of new configs for EuroLinux 9 - -We will also update hardware requirements for rebuild, including reference -build servers for ARM and PowerPC. The rebuilds will start with the release of -EuroLinux 9. It will also require updated infrastructure. - -## Container and cloud images - -You can use the following publicly available images for EuroLinux 9 -- [EuroLinux 9 Vagrant Boxes (libvirt/VMware Workstation/VirtualBox)](https://app.vagrantup.com/eurolinux-vagrant/boxes/eurolinux-9) -- [EuroLinux 9 Container on the Docker Hub](https://hub.docker.com/r/eurolinux/eurolinux-9) -- [EuroLinux 9 Container on the Quay.io](https://quay.io/repository/eurolinux/eurolinux-9) - -## Additional resources - -- [Download EuroLinux ISO](https://fbi.cdn.euro-linux.com/isos/) -- [Download EuroLinux ISO secondary download](https://fbi2.cdn.euro-linux.com/isos/) -- [EuroLinux universal migration scripts](https://github.com/EuroLinux/eurolinux-migration-scripts) -- [EuroLinux Public Request for Change and Bug Tracker](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc) -- [Red Hat 9.2 Release Notes](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/9.2_release_notes/index) parts of our release notes are loosely based on this document. diff --git a/docs/release-notes/9.3.md b/docs/release-notes/9.3.md deleted file mode 100644 index 03a0a12..0000000 --- a/docs/release-notes/9.3.md +++ /dev/null @@ -1,97 +0,0 @@ -# EuroLinux 9.3 Release Notes - -This version's code name is Riga - the capital of Latvia. - -## Major changes in EuroLinux 9.3. - -## Security - -Key security-related highlights: - -- **Keylime** was rebased to version 7.3.0. -- OpenSSH was further migrated from the less secure SHA-1 message digest. -- The **pcsc-lite-ccid** USB Chip/Smart Card Interface Device(CCID)) and Integrated Circuit Card Device (ICCD) driver was rebased to version 1.5.2. -- **SEtools**, the collection of graphical tools, command-line tools, and libraries for SELinux policy analysis, was rebased to version 4.4.3. -- **OpenSCAP** was rebased to version 1.3.8. - -## Programming languages, web and database servers - -Later versions of the following application are now available: - -- **Redis 7** -- **Node.js 20** - -Furthermore, the **Apache HTTP Server** has been updated to version 2.4.57. - -The following components have been upgraded: - -- **Git LFS** to version 3.2.0 -- **Git** to version 2.39.1 - -## Compilers and development tools - -The following system toolchain components have been updated: - -- **GCC** 11.4.1 - -# Updated performance tools and debuggers - -The following performance tools and debuggers have been updated: - -- **Valgrind 3.21** -- **SystemTap 4.9** -- **elfutils 0.189** - -## Updated performance monitoring tools - -The following performance monitoring tools have been updated: - -- **PCP** 6.0.5 -- **Grafana** 9.2.10 - -## Updated compiler toolsets - -The following compiler toolsets have been updated in: - -- **GCC Toolset** 13 -- **LLVM Toolset** 16.0.6 -- **Rust Toolset** 1.71.1 -- **Go Toolset** 1.20.10 - -## Java implementations in EuroLinux 9 - -The EuroLinux 9 AppStream repository includes: - -- The `java-21-openjdk` packages, which provide the OpenJDK 21 Java Runtime Environment and the OpenJDK 21 Java Software Development Kit. -- The `java-11-openjdk` packages, which provide the OpenJDK 11 Java Runtime -- Environment and the OpenJDK 11 Java Software Development Kit. -- The `java-17-openjdk` packages, which provide the OpenJDK 17 Java Runtime -- Environment and the OpenJDK 17 Java Software Development Kit. -- The `java-1.8.0-openjdk packages`, which provide the OpenJDK 8 Java Runtime -- Environment and the OpenJDK 8 Java Software Development Kit. - -## Known issues - -Due to evolution of build process updates for **Java 21 OpenJDK** and **SCAP Security Guide** are delayed now. They are going to be delivered soon. - -## Batteries repositories - -The battery repository is available for customers with Golden Key and Gaia -subscriptions. There are about 330 packages that are not part of any build (so -they are not included in EuroLinux Open Build roots) but are required to -rebuild EuroLinux/Custom Fork from RHEL or Eurolinux sources. - -## Container and cloud images - -You can use the following publicly available images for EuroLinux 9 -- [EuroLinux 9 Vagrant Boxes (libvirt/VMware Workstation/VirtualBox)](https://app.vagrantup.com/eurolinux-vagrant/boxes/eurolinux-9) -- [EuroLinux 9 Container on the Docker Hub](https://hub.docker.com/r/eurolinux/eurolinux-9) -- [EuroLinux 9 Container on the Quay.io](https://quay.io/repository/eurolinux/eurolinux-9) - -## Additional resources - -- [Download EuroLinux ISO](https://fbi.cdn.euro-linux.com/isos/) -- [Download EuroLinux ISO secondary download](https://fbi2.cdn.euro-linux.com/isos/) -- [EuroLinux universal migration scripts](https://github.com/EuroLinux/eurolinux-migration-scripts) -- [EuroLinux Public Request for Change and Bug Tracker](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc) -- [Red Hat 9.3 Release Notes](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html-single/9.3_release_notes/index) parts of our release notes are loosely based on this document. diff --git a/docs/release-notes/9.4.md b/docs/release-notes/9.4.md deleted file mode 100644 index 33035ad..0000000 --- a/docs/release-notes/9.4.md +++ /dev/null @@ -1,92 +0,0 @@ -# EuroLinux 9.4 Release Notes - -This version's code name is San Marino - the capital of San Marino, the world's oldest republic. - -## Major changes in EuroLinux 9.4. - -## Security - -Key security-related highlights: - -- **Rsyslog** log processing system introduces customizable TLS/SSL encryption settings and additional capability dropping options. -- The **OpenSSL** TLS toolkit adds a provider-specific configuration directory. -- The Linux kernel cryptographic API (**libkcapi**) 1.4.0 introduces new tools and options. You can now specify target file names for hash calculations using the -T option. -- The **stunnel** TLS/SSL tunneling service 5.71 provides many new features such as support for modern PostgreSQL clients. - -## Programming languages, web and database servers - -Later versions of the following application are now available: - -- **MariaDB 10.11** -- **nginx 1.24** -- **PHP 8.2** -- **PostgreSQL 16** -- **Python 3.12** - -The following components have been upgraded: - -- **Git LFS** to version 3.4.1 -- **Git** to version 2.43.0 - -## Compilers and development tools -## Updated performance tools and debuggers - -The following performance tools and debuggers have been updated: - -- **elfutils 0.190** -- **SystemTap 5.0** -- **Valgrind 3.22** - -## Updated performance monitoring tools - -The following performance monitoring tools have been updated: - -- **PCP** 6.2.0 - -## Updated compiler toolsets - -The following compiler toolsets have been updated: - -- **GCC Toolset** 13 -- **Go Toolset** 1.21.7 -- **LLVM Toolset** 17.0.6 -- **Rust Toolset** 1.75.1 - -## Java implementations in EuroLinux 9 - -The EuroLinux 9 AppStream repository includes: - -- The `java-21-openjdk` packages, which provide the OpenJDK 21 Java Runtime Environment and the OpenJDK 21 Java Software Development Kit. -- The `java-11-openjdk` packages, which provide the OpenJDK 11 Java Runtime -- Environment and the OpenJDK 11 Java Software Development Kit. -- The `java-17-openjdk` packages, which provide the OpenJDK 17 Java Runtime -- Environment and the OpenJDK 17 Java Software Development Kit. -- The `java-1.8.0-openjdk packages`, which provide the OpenJDK 8 Java Runtime -- Environment and the OpenJDK 8 Java Software Development Kit. - -## Known issues - -Due to evolution of build process update for **SCAP Security Guide** are delayed now. They are going to be delivered soon. - -## Batteries repositories - -The battery repository is available for customers with Golden Key and Gaia -subscriptions. There are about 330 packages that are not part of any build (so -they are not included in EuroLinux Open Build roots) but are required to -rebuild EuroLinux/Custom Fork from RHEL or Eurolinux sources. - -## Container and cloud images - -You can use the following publicly available images for EuroLinux 9: - -- [EuroLinux 9 Vagrant Boxes (libvirt/VMware Workstation/VirtualBox)](https://app.vagrantup.com/eurolinux-vagrant/boxes/eurolinux-9) -- [EuroLinux 9 Container on the Docker Hub](https://hub.docker.com/r/eurolinux/eurolinux-9) -- [EuroLinux 9 Container on the Quay.io](https://quay.io/repository/eurolinux/eurolinux-9) - -## Additional resources - -- [Download EuroLinux ISO](https://fbi.cdn.euro-linux.com/isos/) -- [Download EuroLinux ISO secondary download](https://fbi2.cdn.euro-linux.com/isos/) -- [EuroLinux universal migration scripts](https://github.com/EuroLinux/eurolinux-migration-scripts) -- [EuroLinux Public Request for Change and Bug Tracker](https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc) -- [Red Hat 9.4 Release Notes](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html-single/9.4_release_notes/index) parts of our release notes are loosely based on this document. diff --git a/docs/release-notes/ELD.md b/docs/release-notes/ELD.md deleted file mode 100644 index c85180e..0000000 --- a/docs/release-notes/ELD.md +++ /dev/null @@ -1,26 +0,0 @@ -# EuroLinux 9 Desktop - -**EuroLinux Desktop is a novelty in the operating system market. It combines the look and functionality of Windows® and macOS® with the reliability and security of a server-based Enterprise Linux distribution.** - -## Overview - -EuroLinux Desktop is built upon the source code of Red Hat® Enterprise Linux® 9. However, it includes a number of changes to the user interface. These primarily concern the system's appearance and usability. GNOME extensions have been used for this purpose. In EuroLinux Desktop, they are pre-configured and available immediately after installation - "out of the box." In addition, the Polish language version of EuroLinux Desktop fills in the gaps in the Polish translations of the extensions and GNOME. - -## Appearance & Features - -In EuroLinux Desktop, there is a translucent dock (taskbar) at the bottom of the screen. It stores icons for favorite applications, notifications and running programs, a button that displays icons for all applications in high magnification, as well as date and time information. It is possible to change the position of the bar to the right, left or top of the desktop, as well as to customize it extensively. The user can customize its height, length, transparency, color, icon spacing and size. The system allows icons to be placed on the desktop as standard, and provides a window maximization and minimization function. - -EuroLinux Desktop disables the overview mode and the hotcorner function, which displays the preview mode when you hover the mouse over the top left corner of the screen. When you right-click on the wallpaper, additional menu items appear (including New Text Document). Notification icons from instant messaging or email programs have also been added. EuroLinux Desktop lets you switch day/night themes with a single click on the moon icon in the dock, and allows you to set a schedule for automatic theme switching based on the time of day. - -## Multimedia - -EuroLinux Desktop supports many media file formats (mp3, mpg, wma, ts, opus, ogg, mp4, flac, aiff, acc, ac3, avi), as well as the open codecs used for the popular mkv (Matroska) video files. Each of these formats can be run in the default Totem/Videos system player. - -## Office Suite - -EuroLinux Desktop includes the LibreOffice suite of office applications. It includes a word processor, spreadsheet, presentation editor, vector graphics editor, mathematical formula editor and relational database management system. - -## Software - -EuroLinux Desktop has been integrated with the Flathub repository, providing easy access to more than 2,000 free applications. They can be downloaded from the Software application and installed with a single click. The system also supports applications in AppImage format, the use of which is similar to programs with .exe or .msi extensions. However, in the case of EuroLinux Desktop, the AppImage application is always run from a non-privileged user. The system also allows the use of applications designed for Windows®, thanks to Steam®, Lutris or Wine. - diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css deleted file mode 100644 index ff798e2..0000000 --- a/docs/stylesheets/extra.css +++ /dev/null @@ -1,10 +0,0 @@ -/*general styling*/ -.md-header {position: static!important;} -.md-header, .md-tabs {background-color: #005aa5!important;} .md-tabs {box-shadow: 1px 1px 5px #999} -.md-tabs__link, .md-tabs[data-md-state=hidden] .md-tabs__link {transition: none!important;} -.md-typeset h1, .md-typeset h2 {color: #222; font-weight: bold} -/*info boxes*/ -.md-typeset .info>.admonition-title, .md-typeset .info>summary, .md-typeset .todo>.admonition-title, .md-typeset .todo>summary {background-color: #f3f2fd;} -.md-typeset .admonition.info {border-color: #4051b5;} -.md-typeset .info>.admonition-title:before, .md-typeset .info>summary:before, .md-typeset .todo>.admonition-title:before, .md-typeset .todo>summary:before {background-color: #4051b5;} -.md-typeset p {margin-top: 4px} diff --git a/mkdocs.yml b/mkdocs.yml deleted file mode 100644 index 1e8fd64..0000000 --- a/mkdocs.yml +++ /dev/null @@ -1,43 +0,0 @@ -site_name: EuroLinux Documentation -site_author: EuroLinux Community -site_url: https://docs.euro-linux.com/ -repo_name: eurolinux-open-docs -repo_url: https://github.com/EuroLinux/eurolinux-open-docs - -# EuroLinux theme settings -theme: - name: material - custom_dir: overrides - logo: assets/favicon-white.png - favicon: assets/favicon.png - palette: - primary: indigo - font: - text: Ubuntu - code: Ubuntu Mono - language: en - features: - - navigation.tabs - - toc.integrate - - navigation.footer - icon: - repo: fontawesome/brands/github - -extra: - social: - - icon: fontawesome/solid/blog - link: https://euro-linux.com/blog - - icon: fontawesome/brands/github - link: https://github.com/EuroLinux/ - - icon: fontawesome/brands/linkedin - link: https://www.linkedin.com/company/eurolinux - - icon: fontawesome/brands/twitter - link: https://twitter.com/Euro_Linux -extra_css: - - stylesheets/extra.css - -markdown_extensions: - - admonition - - pymdownx.highlight - - pymdownx.superfences - - pymdownx.keys diff --git a/overrides/main.html b/overrides/main.html deleted file mode 100644 index 156aae3..0000000 --- a/overrides/main.html +++ /dev/null @@ -1,22 +0,0 @@ -{% extends "base.html" %} -{% block extrahead %} - - -{% endblock %} -{% block scripts %} - - - -{% endblock %} diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 63f9fab..0000000 --- a/requirements.txt +++ /dev/null @@ -1,36 +0,0 @@ -Babel==2.13.0 -certifi==2023.7.22 -charset-normalizer==3.3.0 -click==8.1.7 -colorama==0.4.6 -ghp-import==2.1.0 -gitdb==4.0.10 -GitPython==3.1.41 -idna==3.7 -importlib-metadata==6.8.0 -Jinja2==3.1.4 -Markdown==3.5 -MarkupSafe==2.1.3 -mergedeep==1.3.4 -mkdocs==1.5.3 -mkdocs-git-revision-date-plugin==0.3.2 -mkdocs-material==9.4.4 -mkdocs-material-extensions==1.2 -packaging==23.2 -paginate==0.5.6 -pathspec==0.11.2 -platformdirs==3.11.0 -Pygments==2.16.1 -pymdown-extensions==10.3 -pyparsing==3.1.1 -python-dateutil==2.8.2 -PyYAML==6.0.1 -pyyaml_env_tag==0.1 -regex==2023.10.3 -requests==2.31.0 -six==1.16.0 -smmap==5.0.1 -typing-extensions==3.10.0.0 -urllib3==2.0.7 -watchdog==3.0.0 -zipp==3.17.0 diff --git a/search/search_index.json b/search/search_index.json index 185cbc5..aafd2bd 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"EuroLinux","text":""},{"location":"#about-documentation","title":"About Documentation","text":"

This is EuroLinux community-driven documentation.

We welcome your contributions to EuroLinux!

You can:

Info

As EuroLinux is in Open Core model there are also additional documentation for our customer that are available at EuroLinux Support Portal.

Info

You can find our online Enterprise Linux Man pages server here https://man.docs.euro-linux.com.

"},{"location":"#how-documentation-is-organized","title":"How documentation is organized?","text":"

Documentation is organized in the following manner:

"},{"location":"#how-to-contribute","title":"How to contribute","text":"

We love your input! We value transparent and easy to contribute projects, that's why we choose GitHub. You can contribute to this project with:

We Use GitHub with GitHub Flow. All changes are made through pull requests.

Pull requests are the best and well-established way to propose changes. The GitHub Flow that allows us to provide reviews and discussion about documentation/code is described in detail here.

Use our specially crafted issue templates: EuroLinux Open Docs issue from a template to contribute a topic you would like to see.

If you want to contribute with code (we keep documentation as code), do the following:

  1. Fork the repository and create your own branch from master.
  2. It would be great if you could test your changes with mkdocs (described in detail in Setup environment locally)
  3. Write/Apply your changes and commit to your branch.
  4. Create a pull request!
"},{"location":"#github-labs","title":"GitHub Labs","text":"

If you are new to Git VCS (Version Control System) or GitHub, you can visit GitHub Learning Lab, especially First Day on GitHub course. GitHub courses are free, interactive and put stress on practical aspects.

"},{"location":"#tools","title":"Tools","text":"

We are using mkdocs with mkdocs-material to build and style our documentation.

"},{"location":"#setup-environment-locally","title":"Setup environment locally","text":"

Because MkDocs is Python based, you need at least these installed to run this documentation locally:

First, let's create a virtualenv, so you don't bloat your system-wide python environment:

virtualenv -p /usr/bin/python3 venv\n

Then activate virtualenv

Bash:

. venv/bin/activate\n

Fish:

. venv/bin/activate.fish\n

Now you are ready to install MkDocs and other Python packages:

pip install -r requirements.txt\n

After it serving documentation on your host is as easy as running:

mkdocs serve\n

To build documentation invoke:

mkdocs build\n

It will build documentation and save it into site directory

Please don't include site directory in pull requests

Because we deploy this documentation with GitHub Pages, the site directory is not gitignored

"},{"location":"#markdown-cheat-sheet-for-this-project","title":"Markdown cheat sheet for this project","text":"

We created simple cheat sheet for MkDocs markdown syntax with extensions enabled in this project. It can be found here.

"},{"location":"HowTo/centos8-eol-solution/","title":"CentOS 8 End of Life - solution","text":""},{"location":"HowTo/centos8-eol-solution/#introduction","title":"Introduction","text":"

This how-to provides a solution to the problem of CentOS 8 running out of support. With the end of 2021, CentOS ended its life in its stable form and started functioning as CentOS Stream, a development branch for Red Hat\u00ae Enterprise Linux\u00ae. As a result, it stopped receiving proven, stable updates and its use, especially in production environments, became risky. This is a very serious problem for many companies and individuals around the world. So there was an urgent need to find a new source of updates for CentOS in order to keep it in the infrastructure. A complete solution to this problem is support switching, that is, pointing to a new repository from which CentOS will be downloading stable updates. Such a solution is offered by EuroLinux. It is worth mentioning that both CentOS and RHEL and EuroLinux are systems built on the same source code, so they provide the same functionality. They differ mainly in branding.

The operation of switching support is simple, reasonably safe and completely reversible. What is very important, it requires neither reinstallation of the system nor the applications installed on it. The process consists of switching the repository, installing the el-release package, updating the system and reinstalling the system packages in-place. After the in-place migration, CentOS will still be usable, even in production environments.

All resources used in this tutorial can be found in the additional resources section.

"},{"location":"HowTo/centos8-eol-solution/#the-solution","title":"The solution","text":"

A project named eurolinux-migration-scripts has been created. It contains among others a script that will take care of the migration automatically. Here we describe, how to perform the switch successfully.

"},{"location":"HowTo/centos8-eol-solution/#preparations","title":"Preparations","text":"

It's vital that the system be updated to the newest release. Use the following command:

sudo yum update -y\n
"},{"location":"HowTo/centos8-eol-solution/#running-the-migration-script","title":"Running the migration script","text":"

Then download the latest production-ready release of the project containing the script. Unpack the release, visit the unpacked directory and run the script - usually this will require right-clicking in the current directory, using the 'Open in Terminal' option and running this command:

sudo bash migrate2eurolinux.sh\n

Refer to the project's README for additional commands.

"},{"location":"HowTo/centos8-eol-solution/#after-the-switch","title":"After the switch","text":"

Once the migration has finished, it's recommended to reboot your system:

sudo reboot\n

Once the system has rebooted, the migration process can be considered complete. In order to quickly verify that it was carried out successfully, we can check the distribution description:

cat /etc/el-release\n

As a result we should get a response about the distribution and latest EuroLinux version.

"},{"location":"HowTo/centos8-eol-solution/#conclusion","title":"Conclusion","text":"

As you can see, the process is quick and seamless. You can switch the repository for RHEL, Oracle Linux, AlmaLinux, and Rocky Linux the same way. In each case, the process will look almost identical.

If you have any questions or concerns, please submit them to the repository linked in the additional resources section. Thank you.

"},{"location":"HowTo/centos8-eol-solution/#additional-resources","title":"Additional resources","text":""},{"location":"HowTo/create-iso-with-repositories/","title":"How to create ISO file with EuroLinux repositories","text":"

Creating ISO that contains RPM repositories is a straightforward process. First you have to mirror repositories locally - mirroring is described in Mirror EuroLinux Locally How To.

To create an ISO file, you need mkiso command that is part of genisoimage package. You can install it with the following command:

sudo yum install -y genisoimage\n
"},{"location":"HowTo/create-iso-with-repositories/#creating-iso-with-repositories","title":"Creating ISO with repositories","text":"

In the example below, we create ISO from the repositories saved in /repos directory the output is saved to /var/eurolinux-repos.iso.

sudo mkisofs -R -J -o /var/eurolinux-repos.iso /repos/\n

This file could be:

"},{"location":"HowTo/create-iso-with-repositories/#mounting-iso-from-local-file","title":"Mounting ISO from local file","text":"

Mounting local ISO file is as simple as:

sudo mount -o loop /PATH/TO/ISO /MOUNT/PATH\n

example:

sudo mount -o loop /var/eurolinux-repos.iso /mnt/mirror\n
"},{"location":"HowTo/create-iso-with-repositories/#mounting-iso-from-virtual-cd-rom-device","title":"Mounting ISO from virtual cd-rom device","text":"

Mounting CD-ROM device is as simple as:

sudo mount /dev/DEVICE /MOUNT/PATH\n

The following example has ISO mounted as CD-ROM device /dev/sr0:

sudo mount /dev/sr0 /mnt/mirror\n
"},{"location":"HowTo/create-iso-with-repositories/#using-locally-mounted-iso-with-rpm-repositories","title":"Using locally mounted ISO with RPM repositories","text":"

To use the repositories, that the ISO file provides, create a proper .repo file that resides inside /etc/yum.repos.d/ directory.

Here is an example /etc/yum.repos.d/local-iso.repo file for EuroLinux 7 and the ISO image attached to /mnt/mirror directory.

[base]\nname = EuroLinux 7 x86_64 Base\nbaseurl=file:///mnt/mirror/eurolinux-os-7/\nenabled=1\n# Disabled gpgcheck, enable if el-release is already installed on your system\ngpgcheck=0\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7\n\n[updates]\nname = EuroLinux 7 x86_64 Updates\nbaseurl=file:///mnt/mirror/eurolinux-updates-7/\nenabled=1\n# Disabled gpgcheck, enable if el-release is already installed on your system\ngpgcheck=0\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7\n
"},{"location":"HowTo/docker/","title":"Docker","text":"

How to set up your Docker Community Edition installation.

"},{"location":"HowTo/docker/#introduction","title":"Introduction","text":""},{"location":"HowTo/docker/#use-cases","title":"Use cases","text":"

Consider the following examples:

"},{"location":"HowTo/docker/#why-use-docker-containers-over-virtual-machines","title":"Why use Docker containers over virtual machines?","text":"

In short: Docker containers utilize Linux's capabilities such as cgroups and namespaces to create an isolated environment and do not virtualize hardware. Therefore, they are way more lightweight than virtual machines and can be brought up in a large scale in a blink of an eye rather than waiting for a single virtual machine to boot.

For more information, take a look at our blog entry on the basics of containerization.

"},{"location":"HowTo/docker/#system-requirements","title":"System requirements","text":"

The following operating systems and architectures are covered by this guide:

Make sure the containers you want to run are of the same architecture as your machine.

If you need support with installation on the EuroLinux releases this guide does not cover, please create an appropriate ticket.

"},{"location":"HowTo/docker/#installation","title":"Installation","text":""},{"location":"HowTo/docker/#eurolinux-8","title":"EuroLinux 8","text":"

The following steps are based on Docker, Inc. official guide as of 2022.02.01. We will just use the commands provided as snippets for a quick way of copying & pasting one snippet for a successful installation.

The following snippet installs Docker on EuroLinux 8.6. Other releases may work as well, but have not been tested. Once a new EuroLinux release is out, this guide will be updated.

Docker installation removes podman and buildah

Please note that this operation will replace runc with containerd.io and remove both podman and buildah.

sudo yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine\nwhich yum-config-manager || sudo yum install -y yum-utils\nsudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo\nsudo yum install -y docker-ce docker-ce-cli containerd.io --allowerasing\nsudo systemctl enable docker --now\n
"},{"location":"HowTo/docker/#eurolinux-7","title":"EuroLinux 7","text":"

EuroLinux provides their own builds of Docker for EuroLinux 7.

Please prepare your EuroMan credentials and enable the el-server-7-extras-x86_64 channel first, like so:

sudo rhn-channel -u \"$el_euroman_user\" -p \"$el_euroman_password\" -c el-server-7-extras-x86_64 -a\n

Then you are ready to install Docker:

sudo yum install -y docker\nsudo systemctl enable docker --now\n
"},{"location":"HowTo/docker/#whats-next","title":"What's next?","text":"

EuroLinux provides several Docker images for you to use. They are publicly available and free of charge. Take a look at our entry EuroLinux docker images are now available for more information. Additionally, we provide a quick guide for having the images up and running in no time.

"},{"location":"HowTo/els/","title":"Migrate to EuroELS","text":"

This guide is about how to switch your repositories to the ones provided by EuroLinux Extended Life Support.

"},{"location":"HowTo/els/#introduction","title":"Introduction","text":"

Enterprise Linuxes 6 ended their life a few years ago. Still, security updates can be provided by several vendors for a fee. That's where EuroELS comes in. You can extend the lifecycle of your Enterprise Linux up to the half of 2024.

"},{"location":"HowTo/els/#how-to-migrate","title":"How to migrate","text":"

First, make sure that your system is up to date. It should be CentOS 6.10 (minor version 10).

su\nyum update -y\n

Second, in accordance with good practice, we recommend backing up your machine.

Please download the migration script available at this location:

https://github.com/EuroLinux/eurolinux-migration-scripts.git

wget https://github.com/EuroLinux/eurolinux-migration-scripts/archive/refs/heads/el6-only-switch-repos.zip\n

Please unpack the downloaded file:

unzip el6-only-switch-repos.zip\n

and navigate to the script's directory:

cd eurolinux-migration-scripts-el6-only-switch-repos\n

To start the switching process, just run the script with administrator privileges:

./migrate2eurolinux.sh\n

Once the command is executed, we'll get a recommendation to make a backup. Type YES to make the script continue.

The script will ask us about our EuroMan credentials. We provide our login and password when asked.

The repository switch has completed successfully. We can now update our Enterprise Linux 6 with the command:

yum update -y\n
"},{"location":"HowTo/ha-rs-enable-repository/","title":"How to install High Availability and Resilient Storage in EuroLinux 8","text":"

For EuroLinux 8.4, you should update the el-release package. The newer version has resilient-storage and high-availability repositories saved in the /etc/yum.repos.d/certify.repo file.

sudo yum update -y el-release\n

'certify-' prefix

Since EuroLinux 8.6 the 'certify-' prefixes in repo URLs and names are no longer used. These URLs are and will be kept as the symbolic link for backward compatibility. The certify.repo file will be used for the whole EuroLinux 8 lifecycle.

If you cannot update the release package because the new el-release package errata is not security-related, you might manually add the following to the /etc/yum.repos.d/certify.repo

[high-availability]\nname = EuroLinux High Availability\nbaseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/HighAvailability/os\nenabled=0\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8\n\n[resilient-storage]\nname = EuroLinux Resilient Storage\nbaseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/ResilientStorage/os\nenabled=0\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8\n
"},{"location":"HowTo/ha-rs-enable-repository/#enabling-repositories-permanently","title":"Enabling repositories permanently","text":""},{"location":"HowTo/ha-rs-enable-repository/#enabling-high-availability-and-resilient-storage-repository-manually","title":"Enabling High Availability and Resilient Storage repository manually","text":"

Use your favourite text editor and change enabled=0 to enabled=1 for high-availability and resilient-storage repositories.

Before edit:

[resilient-storage]\nname = EuroLinux Resilient Storage\nbaseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/ResilientStorage/os\nenabled=0\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8\n

After Edit:

[resilient-storage]\nname = EuroLinux Resilient Storage\nbaseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/ResilientStorage/os\nenabled=1\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8\n

You should do the identical changes for high-availability repositories.

"},{"location":"HowTo/ha-rs-enable-repository/#enabling-high-availability-and-resilient-storage-repository-with-yum-config-manager","title":"Enabling High Availability and Resilient Storage repository with yum-config-manager","text":"

The yum-config-manager command is part of the yum-utils package. Firstly let's install that package:

sudo yum install -y yum-utils\n

Then enable Resilient Storage and High Availability repository with the following command:

sudo yum-config-manager --enable high-availability\nsudo yum-config-manager --enable resilient-storage\n
"},{"location":"HowTo/ha-rs-enable-repository/#installing-ha-andor-resilient-storage","title":"Installing HA and/or Resilient Storage","text":"

Both High Availability and Resilient Storage have rpm groups, so installing them is trivial.

To install the High Availability add-on, invoke the following command:

sudo yum install -y @ha\n

To install the Resilient Storage add-on, invoke the following command:

sudo yum install -y @resilient-storage\n
"},{"location":"HowTo/ha-rs-enable-repository/#basic-ha-configuration","title":"Basic HA configuration","text":""},{"location":"HowTo/ha-rs-enable-repository/#configuring-firewalld","title":"Configuring firewalld","text":"

Before configuring a firewall, it's appropriate to check if firewalld is actually running. The standard systemctl is-active command is one of the options.

systemctl is-active firewalld\n

For a system that has firewalld started and enabled, you might use good enough configuration with:

sudo firewall-cmd --permanent --add-service=high-availability\nsudo firewall-cmd --reload\n
"},{"location":"HowTo/ha-rs-enable-repository/#starting-pcsd","title":"Starting pcsd","text":"

After configuring a firewall, you can start and enable pcsd (PCS GUI and remote configuration interface) with the following commands:

sudo systemctl start pcsd.service\nsudo systemctl enable pcsd.service\n

To make a very basic test of the pcsd installation, we recommend setting hacluster user password. As root user, you can, for example invoke:

# echo \"secret-pass\" | passwd hacluster --stdin\n

Then login into Pacemaker/Corosync configuration. Use the machine address on port 2224 (example: https://MACHINE_IP:2224) in your browser. The username is hacluster with password you set in previous step.

HTTPS Required

Web browser like Firefox and other programs like cURL will report \"Connection reset by peer\" or \"The connection was reset\" when connecting with cleartext HTTP.

[root@test1 pcsd]# curl localhost:2224\ncurl: (56) Recv failure: Connection reset by peer\n

From this point you can freely configure High Availability and Resilient Storage. We recommend using upstream documentation provided in Additional Links below.

"},{"location":"HowTo/ha-rs-enable-repository/#additional-links","title":"Additional links","text":""},{"location":"HowTo/install-epel-on-eurolinux/","title":"How to Install and Enable EPEL repository on EuroLinux 8","text":"

EPEL (Extra Packages for Enterprise Linux) repository is one of the most popular third-party repositories for the Enterprise Linux family. From the 4th November EuroLinux team included the original epel-release package from EPEL in the BaseOS repo. It was the most voted small quality of life change during our first community meeting. The package is re-signed with a EuroLinux GPG key, so there is no need to accept an external key to install this particular package.

The package version will be checked and updated if necessary during minor releases.

EPEL is an external repository that is community supported

As a company, we cannot provide proper care in terms of security, quality, support and lifecycle standards on a third-party repository. Nevertheless, the EPEL repository has a great history of community support.

"},{"location":"HowTo/install-epel-on-eurolinux/#installing-epel-on-eurolinux","title":"Installing EPEL on EuroLinux","text":"

Installing EPEL on EuroLinux 8 and EuroLinux 7 is as simple as:

sudo yum install -y epel-release\n

EPEL is enabled by default

The base EPEL repository is enabled by default for modular (EuroLinux 8) and non-modular packages. You can enable debuginfo and source packages in respective /etc/yum.repos.d/epel*.repo file.

From this moment, you can install and then use all EPEL goodies like htop, wine or createrepo.

"},{"location":"HowTo/migrate_to_rocky_linux/","title":"Procedure for migrating EuroLinux to RockyLinux","text":"
  1. Preparation:
  2. Ensure a stable and reliable internet connection throughout the entire migration process. This is critical for downloading scripts and packages.
  3. Create a full backup of the system to be migrated.
  4. Test the recovery procedure to ensure you can restore the system in case of interruption or errors during migration.
  5. It is recommended to run the migration in a session manager, e.g., tmux.

  6. Download migration scripts:

  7. For EL8:
    curl -O https://raw.githubusercontent.com/EuroLinux/rocky-tools/feature/vaulted_migration/migrate2rocky/migrate2rocky.sh\n
  8. For EL9:

    curl -O https://raw.githubusercontent.com/EuroLinux/rocky-tools/feature/vaulted_migration/migrate2rocky/migrate2rocky9.sh\n

  9. Migration:

  10. Migrating EuroLinux 8 to RockyLinux 8:

    sudo bash migrate2rocky.sh -r\n

  11. Migrating EuroLinux 9.4 to RockyLinux 9.4:

    • If RockyLinux has not yet released version 9.5:
      sudo bash migrate2rocky9.sh -r\n
    • If RockyLinux has already released version 9.5 or higher:
      sudo bash migrate2rocky9.sh -rv 9.4\n
"},{"location":"HowTo/mirror-eurolinux-locally/","title":"How to set up internal EuroLinux RPM mirror","text":"

This short how-to instructs how to set up your own internal EuroLinux mirror. External (publicly available) mirrors should not be set up this way.

"},{"location":"HowTo/mirror-eurolinux-locally/#system-requirements","title":"System requirements","text":""},{"location":"HowTo/mirror-eurolinux-locally/#mirroring-eurolinux-9","title":"Mirroring EuroLinux 9","text":"

Making a local mirrors for EuroLinux 8 and EuroLinux 9 is simple because:

Use Enterprise Linux 9

These instructions have been tested to work properly on Enterprise Linux 9 and Enterprise Linux 8.

First, let's create the directory where mirroring configuration will reside:

sudo mkdir -p /etc/yum-mirror-config\n

Then, let's create configuration file for EuroLinux 9 mirroring /etc/yum-mirror-config/mirror_yum_el9.conf with the contents:

[main]\ncachedir=/var/cache/yum/mirror/$basearch/$releasever\nkeepcache=0\ndebuglevel=2\nlogfile=/var/log/mirror-yum-el9.log\nplugins=1\nexactarch=0\nobsoletes=0\nreposdir=/dev/null\n\n[baseos]\nname = EuroLinux BaseOS\nbaseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/9/$basearch/BaseOS/os\nenabled=1\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux9\nskip_if_unavailable=1\n\n[appstream]\nname = EuroLinux AppStream\nbaseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/9/$basearch/AppStream/os\nenabled=1\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux9\nskip_if_unavailable=1\n\n[crb]\nname = EuroLinux CRB\nbaseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/9/$basearch/CRB/os\nenabled=1\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux9\nskip_if_unavailable=1\n

Then invoke the command reposync with the following arguments:

reposync --downloadcomps --download-metadata -c /etc/yum-mirror-config/mirror_yum_el9.conf -p /repos\n
"},{"location":"HowTo/mirror-eurolinux-locally/#mirroring-eurolinux-8","title":"Mirroring EuroLinux 8","text":"

Making a local mirror for EuroLinux 8 and EuroLinux 9 is simple because:

Use Enterprise Linux 8

These instructions have been tested to work properly on Enterprise Linux 8. While everything may work well, it's not recommended to use other versions.

First, let's create the file /etc/yum-mirror-config/mirror_yum.conf with the contents:

[main]\ncachedir=/var/cache/yum/mirror/$basearch/$releasever\nkeepcache=0\ndebuglevel=2\nlogfile=/var/log/mirror-yum.log\nplugins=1\nexactarch=0\nobsoletes=0\nreposdir=/dev/null\n\n[baseos]\nname = EuroLinux BaseOS\nbaseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/BaseOS/os\nenabled=1\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8\nskip_if_unavailable=1\n\n[appstream]\nname = EuroLinux AppStream\nbaseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/AppStream/os\nenabled=1\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8\nskip_if_unavailable=1\n\n[powertools]\nname = EuroLinux PowerTools\nbaseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/PowerTools/os\nenabled=1\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8\nskip_if_unavailable=1\n

Then invoke the command reposync with the following arguments:

reposync --downloadcomps --download-metadata -c /etc/yum-mirror-config/mirror_yum.conf -p /repos\n
"},{"location":"HowTo/mirror-eurolinux-locally/#mirroring-eurolinux-7","title":"Mirroring EuroLinux 7","text":"

Use Enterprise Linux 7

These instructions have been tested to work properly on Enterprise Linux 7. While everything may work well, it's not recommended to use other versions.

"},{"location":"HowTo/mirror-eurolinux-locally/#the-official-way","title":"The official way","text":"

EuroLinux 7 is not open-core; therefore, only organizations with a proper license (EuroMan or Golden Key) can mirror it freely.

We know

We are well aware that it is possible to mirror repos even with a single license. You can read about that below.

The official way to mirror EuroLinux repositories is the following:

Create the directory /etc/yum-mirror-config/. With the repokeys residing in that directory, create the file /etc/yum-mirror-config/mirror_yum.conf with the contents:

[main]\ncachedir=/var/cache/yum/mirror/$basearch/$releasever\nkeepcache=0\ndebuglevel=2\nlogfile=/var/log/mirror-yum.log\nexactarch=0\nobsoletes=0\ngpgcheck=0\nplugins=0\nreposdir=/dev/null\n\n[eurolinux-os-7]\nname=el7_x86_64_os\nbaseurl=https://cdn.euro-linux.com/dist/eurolinux/server/7/x86_64/os/\nsslclientkey=/etc/yum-mirror-config/repo.key\nsslclientcrt=/etc/yum-mirror-config/repo.crt\nsslcacert=/etc/yum-mirror-config/ca.crt\n\n[eurolinux-updates-7]\nname=el7_x86_64_updates\nbaseurl=https://cdn.euro-linux.com/dist/eurolinux/server/7/x86_64/updates/\nsslclientkey=/etc/yum-mirror-config/repo.key\nsslclientcrt=/etc/yum-mirror-config/repo.crt\nsslcacert=/etc/yum-mirror-config/ca.crt\n

Then invoke the command reposync with the following arguments:

reposync -d -m --download-metadata -c /etc/yum-mirror-config/mirror_yum.conf -p /repos\n

When the download finishes, the next step is to create repodata and enable groups.

cd /repos/eurolinux-os-7/; createrepo . -g comps.xml\ncd /repos/eurolinux-updates-7/; createrepo . -g comps.xml\n

Info

Enabling updateinfo (erratas information) is a little bit tricky, because firstly you have to find the newest updateinfo, unpack it, then invoke modifyrepo script. It can be automated with the script below.

REPO_DIR=/repos/eurolinux-os-7/\nunset -v LAST_UI\n# finding the newest file\nfor file in \"$REPO_DIR\"/*updateinfo.xml.gz; do\n  [[ \"$file\" -nt \"$LAST_UI\" ]] && LAST_UI=$file\ndone\n# unpacking to updateinfo.xml file\nsudo gunzip -c \"$LAST_UI\"  > \"$REPO_DIR/updateinfo.xml\"\n# Depending on the system - some has modifrepo.py script some has \"normal\" command\n/usr/share/createrepo/modifyrepo.py \"$REPO_DIR/updateinfo.xml\"  \"$REPO_DIR/repodata\" || modifyrepo \"$REPO_DIR/updateinfo.xml\"  \"$REPO_DIR/repodata\"\n\nREPO_DIR=/repos/eurolinux-updates-7/\nunset -v LAST_UI\nfor file in \"$REPO_DIR\"/*updateinfo.xml.gz; do\n  [[ $file -nt $LAST_UI ]] && LAST_UI=$file\ndone\nsudo gunzip -c \"$LAST_UI\"  > \"$REPO_DIR/updateinfo.xml\"\n# Depending on the system - some has modifrepo.py script some has \"normal\" command\n/usr/share/createrepo/modifyrepo.py \"$REPO_DIR/updateinfo.xml\"  \"$REPO_DIR/repodata\" || modifyrepo \"$REPO_DIR/updateinfo.xml\"  \"$REPO_DIR/repodata\"\n
"},{"location":"HowTo/mirror-eurolinux-locally/#the-unsupported-way","title":"The unsupported way","text":"

There is also the possibility to mirror EuroLinux repositories even with a single or even test subscription.

True Product \u2013 Real Support \u2013 Fair Price

We are faithful to our values. We also know that it's always possible to cheat and not play fair. Please be aware that during support inqury, we might check if your system is registered and supported. To this day, we always had pleasure to work with honest companies - please don't ruin that.

Mirroring other distros

The instruction allows cloning other distros, including paid ones. If you want to mirror paid Linux distribution, note that this might breach the license/license agreement.

You can mirror EuroLinux or other Enterprise Linux repositories with the following step:

Then run the following snippet as root:

reposync -d -m --download-metadata --plugins -r el-server-7-x86_64 -p /repos/\n# recreating repodata and updateinfo\nREPO_DIR=/repos/el-server-7-x86_64/\ncd /repos/el-server-7-x86_64/; createrepo . -g comps.xml\nunset -v LAST_UI\nfor file in \"$REPO_DIR\"/*updateinfo.xml.gz; do\n  [[ $file -nt $LAST_UI ]] && LAST_UI=$file\ndone\nsudo gunzip -c \"$LAST_UI\"  > \"$REPO_DIR/updateinfo.xml\"\n# Depending on the system - some has modifrepo.py script some has \"normal\" command\n/usr/share/createrepo/modifyrepo.py \"$REPO_DIR/updateinfo.xml\"  \"$REPO_DIR/repodata\" || modifyrepo \"$REPO_DIR/updateinfo.xml\"  \"$REPO_DIR/repodata\"\n
"},{"location":"HowTo/mirror-eurolinux-locally/#mirroring-eurolinux-6-els","title":"Mirroring EuroLinux 6 ELS","text":"

First, register your system to EuroLinux EuroMan with the migration scripts - use the el6-only-switch-repos branch for this.

Once the system has been registered and is receiving EL6 ELS updates, you can mirror the ELS packages with the following commands. Run them as root:

reposync -d -m --download-metadata --plugins -r els-6-x86_64 -p /repos/\n# recreating repodata and updateinfo\nREPO_DIR=/repos/els-6-x86_64/\ncd /repos/els-6-x86_64/; createrepo . -g comps.xml\nunset -v LAST_UI\nfor file in \"$REPO_DIR\"/*updateinfo.xml.gz; do\n  [[ $file -nt $LAST_UI ]] && LAST_UI=$file\ndone\nsudo gunzip -c \"$LAST_UI\"  > \"$REPO_DIR/updateinfo.xml\"\n# Depending on the system - some has modifrepo.py script some has \"normal\" command\n/usr/share/createrepo/modifyrepo.py \"$REPO_DIR/updateinfo.xml\"  \"$REPO_DIR/repodata\" || modifyrepo \"$REPO_DIR/updateinfo.xml\"  \"$REPO_DIR/repodata\"\n
"},{"location":"HowTo/vagrant-with-libvirt/","title":"Vagrant with vagrant-libvirt plugin on Enterprise Linux 8","text":""},{"location":"HowTo/vagrant-with-libvirt/#introduction","title":"Introduction","text":"

This guide covers the installation of libvirt and related tools along with the Vagrant plugin that allows using libvirt as a provider. This has been tested on a clean installation of EuroLinux 8.5 - only Vagrant has been installed already as described in Vagrant jumpstart.

"},{"location":"HowTo/vagrant-with-libvirt/#terminology","title":"Terminology","text":"

While libvirt can manage many virtualisation solutions, in the context of this document libvirt refers to: QEMU with KVM managed by libvirt.

"},{"location":"HowTo/vagrant-with-libvirt/#why-prefer-libvirt-over-providers-such-as-virtualbox","title":"Why prefer libvirt over providers such as VirtualBox?","text":"

As mentioned, KVM is a native virtualisation solution to Linux. This means a significant performance boost when compared to other providers at the slight cost of portability - if you run Linux only, then this is your solution of choice!

If you have never used libvirt before and just heard about it in this how-to, there are several goodies worth mentioning. As an example unrelated to Vagrant: Virt-Manager allows you to get a similar GUI experience out of KVM as that of e.g. VirtualBox, it is fully Free Software (no worrying about licensing shenanigans) and is more modular - in fact, there is a libvirt VirtualBox driver out there.

"},{"location":"HowTo/vagrant-with-libvirt/#install-the-plugin","title":"Install the plugin","text":"

Normally one would invoke a single command: vagrant plugin install vagrant-libvirt and the plugin would work well out-of-the-box. This is not the case for Linux distributions from the Enterprise Linux family and Upstream is aware of that, but as of today (2021.12.21) it doesn't appear to be resolved.

Because of that, you'll need to build additional components and use them with your Vagrant installation. The following procedure covers all of this and has been tested to work well with EuroLinux 8.5.

Use these commands:

[ \"$(command -v vagrant)\" ] || \\\n( read -p \"Install Vagrant first before running the following commands\" \\\n  && exit 1 )\n\nsudo dnf groupinstall \"Development Tools\" \"Virtualization Host\" -y\nsudo dnf install cmake libvirt-devel ruby-devel -y\n\nmkdir krb5\ncd krb5\nwget https://vault.cdn.euro-linux.com/sources/eurolinux/8/baseos/x86_64/Packages/k/krb5-1.18.2-8.el8.src.rpm\nrpm2cpio krb5*.src.rpm | cpio -idmv\ntar xf krb5*.tar.gz\ncd krb5*/src\n./configure\nmake\nsudo cp -P lib/crypto/libk5crypto.* /opt/vagrant/embedded/lib64/\ncd\n\nmkdir libssh\ncd libssh\nwget https://vault.cdn.euro-linux.com/sources/eurolinux/8/baseos/x86_64/Packages/l/libssh-0.9.4-3.el8.src.rpm\nrpm2cpio libssh*.src.rpm | cpio -idmv\ntar xf libssh*.tar.xz\nmkdir build\ncd build\ncmake ../libssh-*/ -DOPENSSL_ROOT_DIR=/opt/vagrant/embedded/\nmake\nsudo cp lib/libssh* /opt/vagrant/embedded/lib64\ncd\n\nvagrant plugin install vagrant-libvirt && rm -rf krb5 libssh\nsudo usermod -a -G libvirt $USER\n

Next, log out from all of your sessions (graphical and text) and log in again. From now on you should be able to run Vagrant boxes with libvirt if all requirements have been satisfied, e.g. you don't have any other providers enabled (an equivalent of deploying this guide on a clean installation).

"},{"location":"HowTo/vagrant-with-libvirt/#additional-resources","title":"Additional resources","text":""},{"location":"HowTo/virtualbox/","title":"VirtualBox","text":"

How to set up your VirtualBox installation.

"},{"location":"HowTo/virtualbox/#introduction","title":"Introduction","text":""},{"location":"HowTo/virtualbox/#use-cases","title":"Use cases","text":"

Consider the following examples:

"},{"location":"HowTo/virtualbox/#why-use-it-over-other-virtualisation-providers","title":"Why use it over other virtualisation providers?","text":"

VirtualBox is the provider with a copyleft license and a focus on interoperability when it comes to supporting different platforms. This allows you to cooperate with someone running a different operating system and when exchanging documentation - once written it's applicable to anyone that can run the software. New VirtualBox versions usually support older operating systems too. One can enjoy the new features on a system, which has recently reached its End of Life, which can be indispensable for a company that can't migrate yet.

"},{"location":"HowTo/virtualbox/#system-requirements","title":"System requirements","text":"

A brief documentation is available at Upstream's.

Your machine shall support hardware virtualisation. If it doesn't, you either need to perform additional troubleshooting - e.g. enable virtualisation in your machine's BIOS settings.

[ $(grep -cE 'vmx|svm' /proc/cpuinfo) -gt 0 ] && echo \"OK\"\n

Make sure you're running EuroLinux 8 on x86_64 architecture rather than ARM.

[ \"$(arch)\" == \"x86_64\" ] && echo \"OK\"\n
"},{"location":"HowTo/virtualbox/#installation-on-eurolinux-8","title":"Installation on EuroLinux 8","text":"

As of today (2 September 2021), 6.1 is the main VirtualBox branch and this is the one we install in this guide. Assuming your account has been made an administrator during the system installation process, simply run these commands for an installation:

sudo dnf groupinstall \"Development Tools\" -y\nsudo dnf config-manager \\\n  --add-repo=https://download.virtualbox.org/virtualbox/rpm/el/virtualbox.repo\nsudo dnf install VirtualBox-6.1 -y\n

VirtualBox should be ready to use!

"},{"location":"HowTo/virtualbox/#usb-devices","title":"USB devices","text":"

If you want VirtualBox to support USB devices for your system account, run this command as well:

sudo usermod -a -G vboxusers $USER\n

then log out of your graphical session and log in again.

"},{"location":"HowTo/virtualbox/#extension-pack","title":"Extension Pack","text":"

VirtualBox doesn't support certain technologies out-of-the-box, e.g. USB 2.0/3.0 or builtin disk encryption, among others. If you want them to be supported, you will need VirtualBox Extension Pack. Make sure you have read its license and understand its implications - you're responsible for compliance. You may want to read Upstream's FAQ for a quick start.

Once you're sure you'll be able to comply with the licensing terms, run these commands to install the Extension Pack:

export vbox_version=\"$(VBoxManage --version | cut -d'r' -f 1)\"\nwget \"https://download.virtualbox.org/virtualbox/$vbox_version/Oracle_VM_VirtualBox_Extension_Pack-$vbox_version.vbox-extpack\"\nyes | sudo VBoxManage extpack install --replace Oracle_VM_VirtualBox_Extension_Pack-$vbox_version.vbox-extpack\n
"},{"location":"HowTo/virtualbox/#troubleshooting","title":"Troubleshooting","text":""},{"location":"HowTo/virtualbox/#i-cant-enable-hardware-virtualisation-and-prefer-software-emulation","title":"I can't enable hardware virtualisation and prefer software emulation","text":"

As Upstream says, for software mode you'll need VirtualBox branch 6.0 or older.

Please also use version 6.0 if you need to run VMs with software virtualization, as this has been discontinued in 6.1.

"},{"location":"HowTo/virtualbox/#additional-resources","title":"Additional resources","text":""},{"location":"HowTo/virtualbox/#upstreams-release-pages","title":"Upstream's release pages","text":"

If you prefer a manual download, check out Upstream's Linux release pages and use the one they provide for RHEL 8.

"},{"location":"HowTo/virtualbox/#rpm-fusion","title":"RPM Fusion","text":"

Alternatively you can use RPM Fusion repository for installation. The software might differ in branding a bit and only the latest release is provided. Use these commands:

sudo dnf localinstall \\\n  https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -y\nsudo dnf localinstall --nogpgcheck \\\n  https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm -y\nsudo dnf install VirtualBox -y\nsudo akmods --kernels $(uname -r) && sudo systemctl restart vboxdrv.service\n
"},{"location":"HowTo/z-documentation-markdown/","title":"Quick markdown and extensions guide","text":"

The first part of this guide is loosely based on Adam Pritchard markdown-here cheatsheet. We include it here for contributors as reference and show how different pieces will be styled. If you are familiar with markdown, and want to skip to this project specific extensions they start with Admonition:

"},{"location":"HowTo/z-documentation-markdown/#headers","title":"Headers","text":"

Headers are created with #.

# H1 This is is reserved for page title/name\n## H2 [Contribution guide] is h2\n### H3 [Headers] is h3\n...\n###### H6\n

"},{"location":"HowTo/z-documentation-markdown/#this-is-fourth-header","title":"This is fourth header","text":""},{"location":"HowTo/z-documentation-markdown/#this-is-fifth-header","title":"This is fifth header","text":""},{"location":"HowTo/z-documentation-markdown/#this-is-sixth-header","title":"This is sixth header","text":"

Headers are essentials, because table of content is based on them.

"},{"location":"HowTo/z-documentation-markdown/#emphasis","title":"Emphasis","text":"

Emphasis, aka italics, with *asterisks* or _underscores_. \n\nStrong emphasis, aka bold, with **asterisks** or __underscores__.\n\nCombined emphasis with **asterisks and _underscores_**.\n\nStrikethrough uses two tildes. ~~Scratch this.~~\n
Emphasis, aka italics, with asterisks or underscores.

Strong emphasis, aka bold, with asterisks or underscores.

Combined emphasis with asterisks and underscores.

Strikethrough uses two tildes. ~~Scratch this.~~

"},{"location":"HowTo/z-documentation-markdown/#list","title":"List","text":"

Proper markdown required

MK-Docs has proper markdown list ordering that is 1 to 1 with markdown standard.

See: Python Markdown Issue 3

TLDR: You have indent sub-list and paragraps with 4 spaces

(In this example, leading and trailing spaces are shown with with dots: \u22c5)

1. First ordered list item\n2. Another item\n\u22c5\u22c5\u22c5\u22c5* Unordered sub-list. \n1. Actual numbers don't matter, just that it's a number\n\u22c5\u22c5\u22c5\u22c51. Ordered sub-list\n4. And another item.\n\n\u22c5\u22c5\u22c5\u22c5To create paragraph within list item you need newline and four leading spaces. To have a line\u22c5\u22c5\n\u22c5\u22c5\u22c5\u22c5break without a paragraph, you will need to use two trailing spaces.\n\n!!! info Python markdown quirk\n    Python-Markdown won't reset list without paragraph. Even if list types are\n    not compatybile (ordered vs unordered)\n\n* Unordered list can use asterisks\n- Or minuses\n+ Or pluses\n

  1. First ordered list item
  2. Another item
    • Unordered sub-list.
  3. Actual numbers don't matter, just that it's a number
    1. Ordered sub-list
  4. And another item.

    To create paragraph within list item you need newline and four leading spaces. To have a line break without a paragraph, you use two trailing spaces.

Python markdown quirk

Python-Markdown won't reset list without paragraph. Even if list types are not compatybile (ordered vs unordered)

"},{"location":"HowTo/z-documentation-markdown/#code-blocks","title":"Code blocks","text":"

To add code block use (without leading space)

 ```python\n # nice\n for i in range(69, 420):\n   print(i)\n ```\n

Example:

# nice\nfor i in range(69, 420):\n  print(i)\n

"},{"location":"HowTo/z-documentation-markdown/#admonition","title":"Admonition","text":"

Info

This is admontion extension for markdown. It support things like (info,todo), (warning,caution,attention), (danger,error) and more.

Code in markdown:

!!! info\n    This is admontion extension for markdown. It support things like\n    (info,todo), (warning,caution,attention), (danger,error) and more.\n

For more information check documentation

Check mkdocs-material docs

Code in markdown:

!!! warning \"For more information check documentation\"\n    Check [mkdocs-material docs](https://squidfunk.github.io/mkdocs-material/reference/admonitions/)\n

"},{"location":"HowTo/z-documentation-markdown/#keyboard-keys","title":"Keyboard Keys","text":"

Sometimes you might add keys combinations. For example:

To use second TY terminal use following key combination Ctrl+Alt+F2

To make them visible in nice way you should use following syntax:

To use second TY terminal use following key combination ++ctrl+alt+f2++\n

"},{"location":"jumpstarts/8-jumpstart/","title":"EuroLinux 8 Jump Start","text":"

This document contains the necessary information to set up your first EuroLinux 8 installation.

"},{"location":"jumpstarts/8-jumpstart/#system-requirements","title":"System Requirements","text":""},{"location":"jumpstarts/8-jumpstart/#x86_64-64-bit-amdintel-architecture","title":"x86_64 (64 bit AMD/Intel architecture)","text":"

Minimal and recommended requirements are following:

Resource Absolute minimal requirements for cloud deployment Minimal Recommended Logical CPU 1 1 1 RAM 768MB or 512MB with swap space 1 GB 1.5 GB per logical CPU Storage 5 GB (excluding swap) 10GB 20GB

Logical CPU means Physical CPU (including Hyper-Threading) or vCPU (virtual CPU).

Warning

It might be impossible to install EuroLinux on a system that does not meet recommended requirements.

"},{"location":"jumpstarts/8-jumpstart/#aarch64-64-bit-arm-architecture","title":"aarch64 (64 bit ARM architecture)","text":"

Minimal and recommended requirements are following:

Resource Absolute minimal requirements for cloud deployment Minimal Recommended Logical CPU 1 1 1 RAM 1 GB or 512MB with swap space 2 GB 2 GB per logical CPU Storage 5GB 10GB 20GB"},{"location":"jumpstarts/8-jumpstart/#about-absolute-minimums-for-cloud-deployment","title":"About absolute minimums for cloud deployment","text":"

During our internal testing, we were able to boot and use very basic and already installed services on Virtual Machine with only 256 MB of RAM. However, without additional memory or at least swap space available, things like updating the system will result in actions of Kernel Out of Memory (OOM) Killer.

You can try it yourself with EuroLinux Vagrant boxes and following Vagrantfile:

Vagrant.configure(\"2\") do |config|\n  config.vm.box = \"eurolinux-vagrant/eurolinux-8\"\n\n  # Explicitly disable vbguest because we are using rsync\n  if Vagrant.has_plugin?(\"vagrant-vbguest\")\n      config.vbguest.auto_update = false\n  end\n\n  config.vm.provider \"virtualbox\" do |vb|\n    vb.memory = \"256\"\n    vb.cpus = 1\n  end\n  config.vm.provider \"libvirt\" do |vb|\n    vb.memory = \"256\"\n    vb.cpus = 1\n  end\nend\n

It's also possible to install EuroLinux on less than 5 GB of space, but it also requires extra attention.

All absolute minimums for cloud deployments described above are not officially supported by EuroLinux.

"},{"location":"jumpstarts/8-jumpstart/#secure-boot","title":"Secure boot","text":"

At the moment, EuroLinux does not support secure boot. The full secure boot support is planned at the end of Q1/beginning of Q2 2022.

"},{"location":"jumpstarts/8-jumpstart/#how-to-install-eurolinux-8-from-iso","title":"How to install EuroLinux 8 from ISO","text":""},{"location":"jumpstarts/8-jumpstart/#where-can-you-obtain-iso","title":"Where can you obtain ISO?","text":"

We distribute EuroLinux in a responsible open core model. Because of that, you might download EuroLinux from different sources. The two primary sources are:

The only difference is that Customer Portal keeps older versions, when CDN, that is used for mirroring, keeps only two of the latest ISOs for each version to save space (single EuroLinux AppStream ISO might take up to 10 GB).

If you are running a huge deployment, you might consider setting up your own mirror and download ISOs from Intranet.

"},{"location":"jumpstarts/8-jumpstart/#how-to-check-iso-integrity","title":"How to check ISO integrity","text":"

During download, many things can happen - from a network or sending host failure to single-bit error. To check if ISO is undamaged, there are two mechanisms in place.

When the ISO download is completed, you can invoke the sha1sum command on the ISO file and check if checksums match.

[Alex@SpaceShipEL8 Downloads]$ sha1sum EL-8.3-x86_64-20210624-appstream.iso \n6a8abaaebe288553ec8568bd9de3f5fda5f1ddb5  EL-8.3-x86_64-20210624-appstream.iso\n

After booting up, the ISO checking process will start.

"},{"location":"jumpstarts/8-jumpstart/#installation-with-gui","title":"Installation with GUI","text":"

Because even a minimal installation uses a GUI the whole process is simple and straightforward. EuroLinux 8, as well as previous versions, uses Anaconda installer that clearly informs the user what needs to be done in order to install the system.

First, you have to choose the language that will be used during installation:

After configuring the installer language you should see a menu similar to:

"},{"location":"jumpstarts/8-jumpstart/#anaconda-installer-localization-section","title":"Anaconda installer LOCALIZATION section:","text":""},{"location":"jumpstarts/8-jumpstart/#anaconda-installer-software-section","title":"Anaconda installer SOFTWARE section:","text":""},{"location":"jumpstarts/8-jumpstart/#configuring-source-of-the-installation","title":"Configuring source of the installation","text":"

Here you might configure the source of your installation. By default, the system installs from the ISO image itself. This is one of the officially supported ways to install EuroLinux.

If you enable a NIC (Network Interface Card) in the Network installer section, you might add additional EuroLinux repositories and/or other repositories. If you add EuroLinux repositories, the installer will automatically download newer version of the packages.

'certify-' prefix

Since EuroLinux 8.6 the 'certify-' prefixes in repo URLs and names are no longer used. These names and URLs were used before we started distributing our system in the open core model. These URLs are and will be kept as the symbolic link for backward compatibility. They can be used in some older parts of the documentation.

EuroLinux 8 repositories:

For EuroLinux 8 beta:

Limited support.

Hybrid network installation from both ISO and public repositories is not our primary goal in the QA process. Packages in EuroLinux repositories are regularly updated, and it might be impossible to install a system from an external source. Depending on the state of the upstream, we might not fix a potential issue.

Below you can see an example configuration that was used to install a system:

After changing the installation source, you will have to confirm Software Selection.

"},{"location":"jumpstarts/8-jumpstart/#software-selection","title":"Software Selection","text":"

Software Selection allows you to customize which packages will be installed. You might choose from base environment groups like Server with GUI, Workstation or Minimal. You can also install additional package groups.

"},{"location":"jumpstarts/8-jumpstart/#anaconda-installer-system-section","title":"Anaconda installer SYSTEM section:","text":""},{"location":"jumpstarts/8-jumpstart/#anaconda-installer-user-settings-section","title":"Anaconda installer USER SETTINGS section:","text":"

After applying all the necessary changes, the installation can be started with the \"Begin Installation\" button.

"},{"location":"jumpstarts/8-jumpstart/#disk-partition-recommended-minimums","title":"Disk partition recommended minimums","text":"

You need at least the following partitions.

For UEFI, an EFI system partition is also required.

If your storage allows it, the following partitions are also highly recommended:

"},{"location":"jumpstarts/8-jumpstart/#installing-eurolinux-in-basic-graphic-mode","title":"Installing EuroLinux in basic graphic mode","text":"

Suppose there is a problem loading/running your graphics card driver (it might results in a black screen/error message or graphical artifacts). It's possible to install EuroLinux in basic graphics mode.

To do so, choose Troubleshooting on the welcome menu, and then Install EuroLinux 8 in basic graphics mode.

From this point the process is identical to a standard installation with GUI.

"},{"location":"jumpstarts/8-jumpstart/#installing-eurolinux-in-text-mode","title":"Installing EuroLinux in text mode","text":"

To install EuroLinux in text mode:

Before running the installation you have to provide all the necessary information (represented as ! in selection). It's a good idea to refresh the menu with R+Enter command shortly after the installer started.

After customization you are ready to start your installation.

"},{"location":"jumpstarts/8-jumpstart/#other-possibilities","title":"Other possibilities","text":"

EuroLinux can also be installed in the following manner:

Please consult upstream documentation about these topics.

"},{"location":"jumpstarts/8-jumpstart/#using-eurolinux","title":"Using EuroLinux","text":"

From this point, you can use EuroLinux as any other RHEL\u2122 based distribution.

"},{"location":"jumpstarts/8-jumpstart/#submitting-a-request-for-change","title":"Submitting a Request for Change","text":"

We truly care. If there is something that you believe could/should be changed/improved in the EuroLinux distribution and does not break compatibility with the upstream project, then drop us the issue on GitHub! All contributors are extremely welcome.

EuroLinux Distro Bugs and RFC

"},{"location":"jumpstarts/8-jumpstart/#submitting-a-bug-report","title":"Submitting a Bug report","text":"

We decided that submitting bug reports should not involve registration into some nasty miserable software. At the very same time, we know that most open-source developers have GitHub profiles. This choice makes the decision making and work as transparent as possible. That's why we decided to use it as the primary way to submit bugs.

EuroLinux Distro Bugs and RFC

This repository allows you to stay in direct contact with EuroLinux developers.

"},{"location":"jumpstarts/8-jumpstart/#other-ways-to-submit-a-bug-report","title":"Other ways to submit a bug report","text":""},{"location":"jumpstarts/8-jumpstart/#securityconfidential-bug-report","title":"Security/confidential bug report","text":"

Please use the e-mail provided above.

"},{"location":"jumpstarts/9-beta-jumpstart/","title":"EuroLinux 9 Beta Jump Start","text":"

This document contains the necessary information to set up your first EuroLinux 9 Beta installation.

"},{"location":"jumpstarts/9-beta-jumpstart/#system-requirements","title":"System Requirements","text":""},{"location":"jumpstarts/9-beta-jumpstart/#x86_64-64-bit-amdintel-architecture","title":"x86_64 (64 bit AMD/Intel architecture)","text":"

Minimal and recommended requirements are following:

Resource Absolute minimal requirements for cloud deployment Minimal Recommended Logical CPU 1 1 1 RAM 1 GiB or 768 MiB with swap space 2 GiB 1.5 GiB per logical CPU Storage 5 GB (excluding swap) 10GB 20GB

Logical CPU means Physical CPU (including Hyper-Threading) or vCPU (virtual CPU).

Warning

It might be impossible to install EuroLinux on a system that does not meet recommended requirements.

"},{"location":"jumpstarts/9-beta-jumpstart/#about-absolute-minimums-for-cloud-deployment","title":"About absolute minimums for cloud deployment","text":"

During our internal testing, we were able to boot and use very basic and already installed services on Virtual Machine with only 340 MiB of RAM. However, without additional memory or at least swap space available, things like updating the system will result in actions of Kernel Out of Memory (OOM) Killer.

You can try it yourself with EuroLinux Vagrant boxes and the following Vagrantfile:

Vagrant.configure(\"2\") do |config|\n  config.vm.box = \"eurolinux-vagrant/eurolinux-9\"\n\n  # Explicitly disable vbguest because we are using rsync\n  if Vagrant.has_plugin?(\"vagrant-vbguest\")\n      config.vbguest.auto_update = false\n  end\n\n  config.vm.provider \"virtualbox\" do |vb|\n    vb.memory = \"340\"\n    vb.cpus = 1\n  end\n  config.vm.provider \"libvirt\" do |vb|\n    vb.memory = \"340\"\n    vb.cpus = 1\n  end\nend\n

It's also possible to install EuroLinux on less than 5 GB of space, but it also requires extra attention.

All absolute minimums for cloud deployments described above are not officially supported by EuroLinux.

"},{"location":"jumpstarts/9-beta-jumpstart/#secure-boot","title":"Secure boot","text":"

Since EuroLinux 9 Beta is a pre-release version and not ready for production use, Secure Boot support has not been implemented.

"},{"location":"jumpstarts/9-beta-jumpstart/#how-to-install-eurolinux-9-beta-from-iso","title":"How to install EuroLinux 9 Beta from ISO","text":""},{"location":"jumpstarts/9-beta-jumpstart/#where-can-you-obtain-iso","title":"Where can you obtain ISO?","text":"

We distribute EuroLinux in a responsible open core model. Because of that, you might download EuroLinux from different sources. The two primary sources are:

The only difference is that Customer Portal keeps older versions, when CDN, that is used for mirroring, keeps only two of the latest ISOs for each version to save space (single EuroLinux BaseOS ISO might take up to 8 GB).

If you are running a huge deployment, you might consider setting up your own mirror and download ISOs from Intranet.

"},{"location":"jumpstarts/9-beta-jumpstart/#how-to-check-iso-integrity","title":"How to check ISO integrity","text":"

During download, many things can happen - from a network or sending host failure to single-bit error. To check if ISO is undamaged, there are two mechanisms in place.

When the ISO download is completed, you can invoke the sha1sum command on the ISO file and check if checksums match.

$ sha1sum EL-9.0-x86_64-20220225-minimal.iso\n73d39d443e27414085f7107fa21dd214d28b8730  EL-9.0-x86_64-20220225-minimal.iso\n

After booting up, the ISO checking process will start.

"},{"location":"jumpstarts/9-beta-jumpstart/#installation-with-gui","title":"Installation with GUI","text":"

Because even a minimal installation uses a GUI the whole process is simple and straightforward. EuroLinux 9, as well as previous versions, uses Anaconda installer that clearly informs the user what needs to be done in order to install the system.

First, you have to choose the language that will be used during installation: Hint: since the Anaconda installer on EuroLinux 9 activates a network connection automatically if applicable, it also determines the default language by the automatic location detection feature - in this case you can see that Polish has been automatically chosen.

Since this is a Beta release, we might need to confirm that we are aware of this fact and that this release should not be used in production.

After configuring the installer language you should see a menu similar to:

"},{"location":"jumpstarts/9-beta-jumpstart/#anaconda-installer-localization-section","title":"Anaconda installer LOCALIZATION section:","text":""},{"location":"jumpstarts/9-beta-jumpstart/#anaconda-installer-software-section","title":"Anaconda installer SOFTWARE section:","text":""},{"location":"jumpstarts/9-beta-jumpstart/#configuring-source-of-the-installation","title":"Configuring source of the installation","text":"

Here you might configure the source of your installation. By default, the system installs from the ISO image itself. This is one of the officially supported ways to install EuroLinux.

If a NIC (Network Interface Card) has been enabled in the Network & Host Name installer section, you might add additional EuroLinux repositories and/or other repositories. If you add EuroLinux repositories, the installer will automatically download newer version of the packages.

EuroLinux 9 Beta repositories:

Limited support.

Hybrid network installation from both ISO and public repositories is not our primary goal in the QA process. Packages in EuroLinux repositories are regularly updated, and it might be impossible to install a system from an external source. Depending on the state of the upstream, we might not fix a potential issue.

Below you can see an example configuration that was used to install a system - in this case the default 'Minimal' repository has been provided as the only one:

After changing the installation source, you will have to confirm Software Selection.

"},{"location":"jumpstarts/9-beta-jumpstart/#software-selection","title":"Software Selection","text":"

Software Selection allows you to customize which packages will be installed. You might choose from base environment groups like Server with GUI, Workstation or Minimal Install - since we are demonstrating with the minimal ISO image, only the last option is available. You can also install additional package groups.

"},{"location":"jumpstarts/9-beta-jumpstart/#anaconda-installer-system-section","title":"Anaconda installer SYSTEM section:","text":""},{"location":"jumpstarts/9-beta-jumpstart/#anaconda-installer-user-settings-section","title":"Anaconda installer USER SETTINGS section:","text":"

After applying all the necessary changes, the installation can be started with the \"Begin Installation\" button.

"},{"location":"jumpstarts/9-beta-jumpstart/#disk-partition-recommended-minimums","title":"Disk partition recommended minimums","text":"

You need at least the following partitions.

For UEFI, an EFI system partition is also required.

If your storage allows it, the following partitions are also highly recommended:

"},{"location":"jumpstarts/9-beta-jumpstart/#installing-eurolinux-in-basic-graphic-mode","title":"Installing EuroLinux in basic graphic mode","text":"

Suppose there is a problem loading/running your graphics card driver (it might results in a black screen/error message or graphical artifacts). It's possible to install EuroLinux in basic graphics mode.

To do so, choose Troubleshooting on the welcome menu, and then Install EuroLinux 9 in basic graphics mode.

From this point the process is identical to a standard installation with GUI.

"},{"location":"jumpstarts/9-beta-jumpstart/#installing-eurolinux-in-text-mode","title":"Installing EuroLinux in text mode","text":"

To install EuroLinux in text mode:

Since the Anaconda installer on EuroLinux 9 activates a network connection automatically if applicable, it also determines that we can start VNC or use text mode entirely. Since we are demonstrating the text mode installation, we choose the latter option.

Before running the installation you have to provide all the necessary information (represented as ! in selection). It's a good idea to refresh the menu with R+Enter command shortly after the installer started.

After customization you are ready to start your installation.

"},{"location":"jumpstarts/9-beta-jumpstart/#other-possibilities","title":"Other possibilities","text":"

EuroLinux can also be installed in the following manner:

Please consult upstream documentation about these topics.

"},{"location":"jumpstarts/9-beta-jumpstart/#using-eurolinux","title":"Using EuroLinux","text":"

From this point, you can use EuroLinux as any other RHEL\u2122 based distribution.

"},{"location":"jumpstarts/9-beta-jumpstart/#submitting-a-request-for-change","title":"Submitting a Request for Change","text":"

We truly care. If there is something that you believe could/should be changed/improved in the EuroLinux distribution and does not break compatibility with the upstream project, then drop us the issue on GitHub! All contributors are extremely welcome.

EuroLinux Distro Bugs and RFC

"},{"location":"jumpstarts/9-beta-jumpstart/#submitting-a-bug-report","title":"Submitting a Bug report","text":"

We decided that submitting bug reports should not involve registration into some nasty miserable software. At the very same time, we know that most open-source developers have GitHub profiles. This choice makes the decision making and work as transparent as possible. That's why we decided to use it as the primary way to submit bugs.

EuroLinux Distro Bugs and RFC

This repository allows you to stay in direct contact with EuroLinux developers.

"},{"location":"jumpstarts/9-beta-jumpstart/#other-ways-to-submit-a-bug-report","title":"Other ways to submit a bug report","text":""},{"location":"jumpstarts/9-beta-jumpstart/#securityconfidential-bug-report","title":"Security/confidential bug report","text":"

Please use the e-mail provided above.

"},{"location":"jumpstarts/9-jumpstart/","title":"EuroLinux 9 Jump Start","text":"

This document contains the necessary information to set up your first EuroLinux 9 installation.

"},{"location":"jumpstarts/9-jumpstart/#system-requirements","title":"System Requirements","text":""},{"location":"jumpstarts/9-jumpstart/#x86_64-64-bit-amdintel-architecture","title":"x86_64 (64 bit AMD/Intel architecture)","text":"

Minimal and recommended requirements are following:

Resource Absolute minimal requirements for cloud deployment Minimal Recommended Logical CPU 1 1 1 RAM 1 GiB or 768 MiB with swap space 2 GiB 1.5 GiB per logical CPU Storage 5 GB (excluding swap) 10GB 20GB

Logical CPU means Physical CPU (including Hyper-Threading) or vCPU (virtual CPU).

Warning

It might be impossible to install EuroLinux on a system that does not meet recommended requirements.

"},{"location":"jumpstarts/9-jumpstart/#about-absolute-minimums-for-cloud-deployment","title":"About absolute minimums for cloud deployment","text":"

During our internal testing, we were able to boot and use very basic and already installed services on Virtual Machine with only 340 MiB of RAM. However, without additional memory or at least swap space available, things like updating the system will result in actions of Kernel Out of Memory (OOM) Killer.

You can try it yourself with EuroLinux Vagrant boxes and the following Vagrantfile:

Vagrant.configure(\"2\") do |config|\n  config.vm.box = \"eurolinux-vagrant/eurolinux-9\"\n\n  # Explicitly disable vbguest because we are using rsync\n  if Vagrant.has_plugin?(\"vagrant-vbguest\")\n      config.vbguest.auto_update = false\n  end\n\n  config.vm.provider \"virtualbox\" do |vb|\n    vb.memory = \"340\"\n    vb.cpus = 1\n  end\n  config.vm.provider \"libvirt\" do |vb|\n    vb.memory = \"340\"\n    vb.cpus = 1\n  end\nend\n

It's also possible to install EuroLinux on less than 5 GB of space, but it also requires extra attention.

All absolute minimums for cloud deployments described above are not officially supported by EuroLinux.

"},{"location":"jumpstarts/9-jumpstart/#how-to-install-eurolinux-9-from-iso","title":"How to install EuroLinux 9 from ISO","text":""},{"location":"jumpstarts/9-jumpstart/#where-can-you-obtain-iso","title":"Where can you obtain ISO?","text":"

We distribute EuroLinux in a responsible open core model. Because of that, you might download EuroLinux from different sources. The two primary sources are:

The only difference is that Customer Portal keeps older versions, when CDN, that is used for mirroring, keeps only two of the latest ISOs for each version to save space (single EuroLinux BaseOS ISO might take up to 8 GB).

If you are running a huge deployment, you might consider setting up your own mirror and download ISOs from Intranet.

"},{"location":"jumpstarts/9-jumpstart/#how-to-check-iso-integrity","title":"How to check ISO integrity","text":"

During download, many things can happen - from a network or sending host failure to single-bit error. To check if ISO is undamaged, there are two mechanisms in place.

When the ISO download is completed, you can invoke the sha1sum command on the ISO file and check if checksums match.

$ sha1sum EL-9.0-x86_64-20220613-appstream.iso \nd78eebb3472ddff2dcaf110907e42ccee0367f70  EL-9.0-x86_64-20220613-appstream.iso\n

After booting up, the ISO checking process will start.

"},{"location":"jumpstarts/9-jumpstart/#installation-with-gui","title":"Installation with GUI","text":"

Because even a minimal installation uses a GUI the whole process is simple and straightforward. EuroLinux 9, as well as previous versions, uses Anaconda installer that clearly informs the user what needs to be done in order to install the system.

First, you have to choose the language that will be used during installation: Hint: since the Anaconda installer on EuroLinux 9 activates a network connection automatically if applicable, it also determines the default language by the automatic location detection feature - in this case you can see that Polish has been automatically chosen.

After configuring the installer language you should see a menu similar to:

"},{"location":"jumpstarts/9-jumpstart/#anaconda-installer-localization-section","title":"Anaconda installer LOCALIZATION section:","text":""},{"location":"jumpstarts/9-jumpstart/#anaconda-installer-software-section","title":"Anaconda installer SOFTWARE section:","text":""},{"location":"jumpstarts/9-jumpstart/#configuring-source-of-the-installation","title":"Configuring source of the installation","text":"

Here you might configure the source of your installation. By default, the system installs from the ISO image itself. This is one of the officially supported ways to install EuroLinux.

If a NIC (Network Interface Card) has been enabled in the Network & Host Name installer section, you might add additional EuroLinux repositories and/or other repositories. If you add EuroLinux repositories, the installer will automatically download newer version of the packages.

EuroLinux 9 repositories:

Limited support.

Hybrid network installation from both ISO and public repositories is not our primary goal in the QA process. Packages in EuroLinux repositories are regularly updated, and it might be impossible to install a system from an external source. Depending on the state of the upstream, we might not fix a potential issue.

Below you can see an example configuration that was used to install a system - in this case the default 'Minimal' repository has been provided as the only one:

After changing the installation source, you will have to confirm Software Selection.

"},{"location":"jumpstarts/9-jumpstart/#software-selection","title":"Software Selection","text":"

Software Selection allows you to customize which packages will be installed. You might choose from base environment groups like Server with GUI, Workstation or Minimal Install - since we are demonstrating with the minimal ISO image, only the last option is available. You can also install additional package groups.

"},{"location":"jumpstarts/9-jumpstart/#anaconda-installer-system-section","title":"Anaconda installer SYSTEM section:","text":""},{"location":"jumpstarts/9-jumpstart/#anaconda-installer-user-settings-section","title":"Anaconda installer USER SETTINGS section:","text":"

After applying all the necessary changes, the installation can be started with the \"Begin Installation\" button.

"},{"location":"jumpstarts/9-jumpstart/#disk-partition-recommended-minimums","title":"Disk partition recommended minimums","text":"

You need at least the following partitions.

For UEFI, an EFI system partition is also required.

If your storage allows it, the following partitions are also highly recommended:

"},{"location":"jumpstarts/9-jumpstart/#installing-eurolinux-in-basic-graphic-mode","title":"Installing EuroLinux in basic graphic mode","text":"

Suppose there is a problem loading/running your graphics card driver (it might results in a black screen/error message or graphical artifacts). It's possible to install EuroLinux in basic graphics mode.

To do so, choose Troubleshooting on the welcome menu, and then Install EuroLinux 9 in basic graphics mode.

From this point the process is identical to a standard installation with GUI.

"},{"location":"jumpstarts/9-jumpstart/#installing-eurolinux-in-text-mode","title":"Installing EuroLinux in text mode","text":"

To install EuroLinux in text mode:

Since the Anaconda installer on EuroLinux 9 activates a network connection automatically if applicable, it also determines that we can start VNC or use text mode entirely. Since we are demonstrating the text mode installation, we choose the latter option.

Before running the installation you have to provide all the necessary information (represented as ! in selection). It's a good idea to refresh the menu with R+Enter command shortly after the installer started.

After customization you are ready to start your installation.

"},{"location":"jumpstarts/9-jumpstart/#other-possibilities","title":"Other possibilities","text":"

EuroLinux can also be installed in the following manner:

Please consult upstream documentation about these topics.

"},{"location":"jumpstarts/9-jumpstart/#using-eurolinux","title":"Using EuroLinux","text":"

From this point, you can use EuroLinux as any other RHEL\u2122 based distribution.

"},{"location":"jumpstarts/9-jumpstart/#submitting-a-request-for-change","title":"Submitting a Request for Change","text":"

We truly care. If there is something that you believe could/should be changed/improved in the EuroLinux distribution and does not break compatibility with the upstream project, then drop us the issue on GitHub! All contributors are extremely welcome.

EuroLinux Distro Bugs and RFC

"},{"location":"jumpstarts/9-jumpstart/#submitting-a-bug-report","title":"Submitting a Bug report","text":"

We decided that submitting bug reports should not involve registration into some nasty miserable software. At the very same time, we know that most open-source developers have GitHub profiles. This choice makes the decision making and work as transparent as possible. That's why we decided to use it as the primary way to submit bugs.

EuroLinux Distro Bugs and RFC

This repository allows you to stay in direct contact with EuroLinux developers.

"},{"location":"jumpstarts/9-jumpstart/#other-ways-to-submit-a-bug-report","title":"Other ways to submit a bug report","text":""},{"location":"jumpstarts/9-jumpstart/#securityconfidential-bug-report","title":"Security/confidential bug report","text":"

Please use the e-mail provided above.

"},{"location":"jumpstarts/cloud-jump-start/","title":"Eurolinux on clouds Jump Start","text":"

This document contains the necessary information to create Your own EuroLinux instance on cloud You prefer.

"},{"location":"jumpstarts/cloud-jump-start/#amazon-web-services-aws","title":"Amazon Web Services (AWS)","text":"

AWS was launched in 2006 and has since grown to become one of the largest cloud computing platforms in the world, with millions of customers and clients ranging from startups to enterprises.

"},{"location":"jumpstarts/cloud-jump-start/#how-to-create-eurolinux-instance-on-aws","title":"How to create EuroLinux instance on AWS","text":"
  1. Check our products on AWS Marketplace and select Your favourite.
  2. Click \"Continue to Subscribe\" and then \"Continue to Configuration\"
  3. Select version, region and click \"Continue to Launch\"
  4. Configure the instance as You prefer. Remember to select or create new key pair - it's necessary to create secure connection with instance.
  5. Click \"Launch\"
  6. To get the ip of this instance, go to the EC2 console and select \"Instances\"
  7. Click on Instance ID of the newly created instance and copy ip address
  8. You can log into instance using the ssh comand with -i key-file.pem option
"},{"location":"jumpstarts/cloud-jump-start/#microsoft-azure","title":"Microsoft Azure","text":"

With its strong focus on security and compliance, Azure has become a popular choice for organizations in regulated industries such as healthcare and finance, as well as for government agencies.

"},{"location":"jumpstarts/cloud-jump-start/#how-to-create-eurolinux-instance-on-microsoft-azure","title":"How to create EuroLinux instance on Microsoft Azure","text":"
  1. On the Azure Marketplace page, click \"Get It Now\" and accept the service terms.
  2. You will be redirected to the Azure portal, where you will see a \"Create\" button after logging in.
  3. In the \"Basics\" section of the virtual machine settings menu, pay special attention to the \"Administrator account\" section, where you will choose the type of authentication and enter a username that you will use to log in to the machine.
  4. Completing the creation of a typical virtual machine requires simply filling in the required fields in the \"Basics\" section. Then move on to \"Review + create\" and click the \"Create\" button.
  5. Your virtual machine will be created along with all the resources needed for it to function properly. To connect to it, simply select it and use one of the connection options (SSH, RDP, or Bastion) offered by Azure.
"},{"location":"jumpstarts/cloud-jump-start/#google-cloud-platform-gcp","title":"Google Cloud Platform (GCP)","text":"

GCP is designed to allow developers and businesses to build, deploy, and run applications and services on Google's infrastructure.

"},{"location":"jumpstarts/cloud-jump-start/#how-to-create-eurolinux-instance-on-gcp","title":"How to create EuroLinux instance on GCP","text":"
  1. Make sure you have gcloud tool and all its components installed.
  2. Log into your GCP account via gcloud tool
  3. Choose or create a new project.
  4. Run the following command in the console:

    gcloud beta compute instances create [instance-name] --zone=[zone-name] --machine-type=[machine-type] --subnet=default --image=[image-url] --boot-disk-size=[disk-size]\n

    Where: * [instance-name] is the desired name for the virtual machine. * [zone-name] is the zone where the virtual machine will be created. * [machine-type] is the type of machine to be created. * [image-url] is the URL of the image. * [disk-size] is the size of the boot disk.

    For example to create EuroLinux 8.6 instance in a us-central1-a region, type:

    gcloud beta compute instances create eurolinux-server1 --zone=us-central1-a --machine-type=n1-standard-1 --subnet=default --image=https://www.googleapis.com/compute/v1/projects/eurolinux-cloud/global/images/eurolinux-8-6 --boot-disk-size=10GB\n

"},{"location":"jumpstarts/cloud-jump-start/#alibaba-cloud","title":"Alibaba Cloud","text":"

Alibaba Cloud, also known as Aliyun aims to provide reliable and secure cloud computing solutions for businesses and organizations around the world, with a focus on serving the Asia-Pacific market.

"},{"location":"jumpstarts/cloud-jump-start/#how-to-create-eurolinux-instance-on-alibaba-cloud","title":"How to create EuroLinux instance on Alibaba Cloud","text":"
  1. Go to Alibaba Cloud Marketplace and select your favorite EuroLinux operating system image.
  2. Review the product description and then click the \"Choose Your Plan\" button. You will now be redirected to the Aliyun console page where you will continue creating the instance.
  3. Configure the instance to meet your needs. At this point, you can also change the payment type to subscription.
  4. In the System Configurations tab, select or create a \"Key Pair\" that will allow you to access the machine.
  5. Finally, accept the terms and create the instance by clicking \"Create Instance\". After a few minutes, your instance should be ready to use.
"},{"location":"jumpstarts/cloud-jump-start/#openstack","title":"OpenStack","text":"

OpenStack provides a flexible and customizable platform that can be used for a variety of cloud computing needs, from web hosting to big data processing to scientific computing.

Important: It is a cloud-generic images.

"},{"location":"jumpstarts/cloud-jump-start/#how-to-create-eurolinux-instance-on-openstack","title":"How to create EuroLinux instance on OpenStack","text":"
  1. Download Your favourite EuroLinux image in qcow2 or raw format. For example: https://fbi.cdn.euro-linux.com/images/EL-9-cloudgeneric-2023-03-19.qcow2
  2. Login to the OpenStack dashboard.
  3. Click on the \"Create Image\" button in \"Compute\" -> \"Images\" section.
  4. Fill in the required information and upload this image to OpenStack.
  5. To Launch Your instance with image You have just created simply click \"Launch Instance\" in \"Compute\" -> \"Instances\" section and fill the required informations.
  6. Make sure You create Your own key-pair and attach it to this instance.
  7. To log into Your EuroLinux instance copy the IP address and using the ssh comand with -i key-file.pem option, login as root to newly created machine.

Important: EuroLinux 9 have the root login without-password enabled by default, which means You have to assign the key-pair to Your instance to login.

"},{"location":"jumpstarts/container-jumpstart/","title":"EuroLinux Containers JumpStart","text":""},{"location":"jumpstarts/container-jumpstart/#basics","title":"Basics","text":"

Using EuroLinux container images is easy. We provide multiple containers and their versions. The most important are base images for EuroLinux 7 (with FBI [Free Base Image] repository) and EuroLinux 8 (with complete repositories - EuroLinux 8 is freely available). All EuroLinux container images are OCI standard container images. You can download them from two primary sources:

EuroLinux images can be run with any OCI standardized container runtimes such as runC (Docker/Moby project) or crun (Podman/Buildah/CRI-O).

To download the image:

Docker Hub:

docker pull eurolinux/eurolinux-8\n

Quay.IO:

podman pull quay.io/eurolinux/eurolinux-8\n

To run a container that will be removed after process exit. You might use:

docker run -rm -ti eurolinux/eurolinux-8\n

Inside the container, you can check the system version

bash-4.4# cat /etc/el-release\nEuroLinux release 8.5 (Tirana)\n

To detach the container from the console, add -d flag to docker/podman run command.

docker run -rm -ti -d --name eurolinux eurolinux/eurolinux-8\n
then run:
docker exec -it eurolinux bash\n
to enter the console of a container.

"},{"location":"jumpstarts/container-jumpstart/#other-containers","title":"Other containers","text":"

As a company, we create and support multiple containers, including other Enterprise Linux distributions. For example, we provide:

Other containers that we build are:

You can visit our organization page on the Docker Hub to find all containers that we officially support.

"},{"location":"jumpstarts/container-jumpstart/#older-versions","title":"Older Versions","text":"

If you want to use the previous version of the EuroLinux container, you must find the desired tag. Example for EuroLinux 8:

"},{"location":"jumpstarts/container-jumpstart/#request-for-changecomment-and-bug-report-repository","title":"Request for Change/Comment and Bug report repository","text":"

You can request a change, leave a comment or report a bug in this EuroLinux containers RFC repository.

"},{"location":"jumpstarts/rpi/","title":"EuroLinux for Raspberry Pi Jump Start","text":""},{"location":"jumpstarts/rpi/#about-images","title":"About images","text":"

EuroLinux Raspberry images are made for Raspberry Pi 4 model B. The system is EuroLinux 9. The minimal images could work with older Raspberry Pi 3. But we won't support it even with 'best effort' as Raspberry Pi 3 does not meet the minimum hardware requirements for Enterprise Linux 9 or Enterprise Linux 8.

The basic credentials are the following:

SSH Root login disabled

SSH root login is disabled by default on EuroLinux 9.

Raspberry only

The Raspberry Pi images also won't work with other ARM-64 computers as RPI images are specially tailored for this particular hardware.

"},{"location":"jumpstarts/rpi/#downloading-and-checking-the-images","title":"Downloading and checking the images","text":"

Firstly choose the image from https://fbi.cdn.euro-linux.com/images. The Raspberry Pi images have the rpi-TYPE(where TYPE can be minimal or gnome) in their names. You can download the image with wget, curl or with your browser.

It's advised to check the image integrity by comparing checksums. The SHA256 checksums can be found at https://fbi.cdn.euro-linux.com/images/sha256sum.txt

Example download and checksum comparison:

wget https://fbi.cdn.euro-linux.com/images/EuroLinux-9-rpi-minimal-2023-01-02-sda.raw.xz\nsha256sum EuroLinux-9-rpi-minimal-2023-01-02-sda.raw.xz\ncurl -s https://fbi.cdn.euro-linux.com/images/sha256sum.txt | grep EuroLinux-9-rpi-minimal-2023-01-02-sda.raw.xz\n

"},{"location":"jumpstarts/rpi/#flashing-the-microsd-card","title":"Flashing the MicroSD card","text":"

With the image downloaded now, it's time to flash your MicroSD card. There are multiple options, you can use:

We recommend Balena Etcher as dd might destroy the system partition or other important data if used without proper experience.

"},{"location":"jumpstarts/rpi/#balena-etcher","title":"Balena Etcher","text":"

Balena Etcher is one of the most popular and easy-to-use programs that allow flashing the SD cards for Raspberry Pi. It can also create other bootable media like USB sticks and more. Firstly download the AppImage from the official Balena Etcher website - https://www.balena.io/etcher/ (Download for Linux x64).

Most file managers will run AppImage when chosen and clicked. To run it from the command line firstly change the permissions then run.

chmod 755 balenaEtcher-1.13.1-x64.AppImage\n./balenaEtcher-1.13.1-x64.AppImage\n

The process itself is straightforward. There is plenty of documentation/videos about the Balena Etcher, so we trust that in case of any troubles you will be able to find a solution on your own.

"},{"location":"jumpstarts/rpi/#dd","title":"dd","text":"

dd is a program that is older than Linux Kernel itself :). It is one of these little tool that makes Linux/Unix powerful. It can be used to flash the memory card by writing output to the memory card device.

Firstly insert the memory card into the slot. Then check with the dmesg device file that is corresponding.

The dmesg will inform about partition:

[ TIME] scsi 0:0:0:0: Direct-Access     Generic  Mass-Storage     1.11 PQ: 0 ANSI: 2\n[ TIME] scsi 0:0:0:0: Attached scsi generic sg0 type 0\n[ TIME] sd 0:0:0:0: [sdX] 250347520 512-byte logical blocks: (128 GB/119 GiB)\n[ TIME] sd 0:0:0:0: [sdX] Write Protect is off\n[ TIME] sd 0:0:0:0: [sdX] Mode Sense: 03 00 00 00\n[ TIME] sd 0:0:0:0: [sdX] No Caching mode page found\n[ TIME] sd 0:0:0:0: [sdX] Assuming drive cache: write through\n

Where sdX is your SD card. To write you first need to decompress the image with the xzcat command and then pipe output to the dd (writing to the device requires root privileges, that's why there is sudo).

xzcat /path/to/image/image.raw.xz | sudo dd status=progress oflag=sync bs=4k of=/dev/sdX\n

For example:

xzcat ~/Downloads/EuroLinux-9-rpi-minimal-2023-01-02-sda.raw.xz | sudo dd status=progress oflag=sync bs=4k of=/dev/sda\n

"},{"location":"jumpstarts/rpi/#booting-from-usb","title":"Booting from USB.","text":"

EuroLinux 9.1 can be natively booted from USB on Raspberry Pi 4. You should flash your USB stick/disk in the same manner that you flash a micro SD card.

Early-produced RPI 4 might require firmware update.

Early-produced Raspberry Pi 4 might require a firmware update before booting the system from the USB.

"},{"location":"jumpstarts/rpi/#wifi-setup","title":"Wifi setup","text":"

Wifi adapter works out-of-box. It's trivial to configure it from a desktop (Gnome). To configure the WIFI from the console you can use the following commands.

Firstly find the SSID (WIFI name) that you want to use:

nmcli d wifi list\n

Then you can provide a password on the command line (note password will be saved in bash command history)

nmcli d wifi connect WIFI_NAME password PASSWORD\n

or if You want to be prompted for the password

nmcli d wifi connect WIFI_NAME --ask\n

Note that your RPI will automatically connect to the WIFI after reboot.

"},{"location":"jumpstarts/rpi/#disable-the-powersave-mode-on-the-raspberry-pi-wifi-card","title":"Disable the powersave mode on the Raspberry Pi WIFI card","text":"

The Raspberry Pi WIFI card by default enters powersave mode when there is not much going on. Some users reported a problem with broken SSH sessions and other closed connections due to this feature. To disable power save mode use the following command

iw wlan0 set power_save off\n

The problem with this solution is that this state won't survive system reboot. To fix that issue during startup you can add a network manager dispatcher script that will disable power_save on boot. Put the following script:

#!/usr/bin/env bash\n\ninterface=$1\nevent=$2\n\nif [[ $interface != \"wlan0\" ]] || [[ $event != \"up\" ]]\nthen\n  return 0\nfi\niw wlan0 set power_save off\n

into the /etc/NetworkManager/dispatcher.d/iw-wlan0-disable-powersave.sh, then add the execution permission

chmod +x /etc/NetworkManager/dispatcher.d/iw-wlan0-disable-powersave.sh\n
"},{"location":"jumpstarts/rpi/#enabling-the-i2c-i2c-inter-integrated-circuit","title":"Enabling the I2C (I\u00b2C - Inter-Integrated Circuit)","text":"

To enable i2c you have to add the i2c_arm with flag on as dtparam to the /boot/config.txt

dtparam=i2c_arm=on\n

The following script can be used:

echo 'dtparam=i2c_arm=on'  | sudo tee -a /boot/config.txt\n

We also recommend installing i2c-tools.

sudo dnf install -y i2c-tools\n

After this changes, you have to reboot the system to start i2c.

"},{"location":"jumpstarts/rpi/#enabling-spi-serial-peripheral-interface","title":"Enabling SPI (Serial Peripheral Interface).","text":"

To enable SPI you have to add spi with flag on as dtparam to the /boot/config.txt

dtparam=spi=on\n
The following script can be used:
echo 'dtparam=spi=on'  | sudo tee -a /boot/config.txt\n
After this changes you have to reboot the system to start SPI.

"},{"location":"jumpstarts/rpi/#feedback","title":"Feedback","text":"

If You want to leave feedback/request for change/bug report on EuroLinux Raspberry Pi images please use the https://github.com/EuroLinux/raspberry-pi-build repository.

If believe that something important from the documentation is missing don't hesitate to create issue in this documentation repository.

"},{"location":"jumpstarts/vagrant-jumpstart/","title":"Vagrant Jumpstart","text":""},{"location":"jumpstarts/vagrant-jumpstart/#introduction","title":"Introduction","text":"

Ever wanted to create a development environment that is guaranteed to work flawlessly on several developers' workstations without the It works on my machine! excuses? Well, now you can! Just get Vagrant, write your specification and share it with coworkers!

"},{"location":"jumpstarts/vagrant-jumpstart/#requirements","title":"Requirements","text":"

Vagrant will be managing the virtual machines of the backend provider of your choice. If you find out it's not listed, consider checking if there's a plugin-based implementation. Make sure you have a supported provider installed - we'll be using VirtualBox in this guide. You can use our VirtualBox installation guide as a reference.

"},{"location":"jumpstarts/vagrant-jumpstart/#installation-on-eurolinux-8","title":"Installation on EuroLinux 8","text":"

Simply run these commands and you're ready to go:

sudo dnf config-manager \\\n  --add-repo=https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo\nsudo dnf install vagrant -y\n
"},{"location":"jumpstarts/vagrant-jumpstart/#eurolinux-boxes","title":"EuroLinux Boxes","text":"

A box is a format that defines: an image of an operating system with preinstalled software, a provider for that image and its version - it's a ready-made appliance for that provider to run. This appliance works the same across people's workstations, which most likely will have differences in configuration and potentially different providers or even operating systems. That is as long as they use a provider, which the box is built for.

EuroLinux Vagrant boxes are available at: https://app.vagrantup.com/eurolinux-vagrant Let's use the box eurolinux-vagrant/eurolinux-8 as an example.

"},{"location":"jumpstarts/vagrant-jumpstart/#box-details","title":"Box details","text":"

See the details of the box - multiple providers, that the box has been built for, are listed along with the box versions and build dates. When writing your specification, you'll be able to choose from them as you wish.

"},{"location":"jumpstarts/vagrant-jumpstart/#run-the-box","title":"Run the box","text":"

Here's a basic procedure for running a Vagrant environment (a virtual machine, which uses our box) in a separate directory:

mkdir el8-vagrant\ncd el8-vagrant/\nvagrant init eurolinux-vagrant/eurolinux-8\nvagrant up\nvagrant ssh\n

You should now be connected to the machine and able to perform your desired operations inside it. Go ahead, play around, install your favourite developer tools, build an awesome, advanced, multi-component application and be sure everyone's able to deploy it on their workstations without any hassle!

"},{"location":"jumpstarts/vagrant-jumpstart/#what-about-the-specification-mentioned-earlier-vagrantfile","title":"What about the specification mentioned earlier? - Vagrantfile","text":"

Once you've ran the commands above, you'll have a Vagrantfile in the el8-vagrant directory. Take a look, what's inside. You'll be greeted with an introduction, references and lots of common options along with comments explaining them:

  # The most common configuration options are documented and commented below.\n  # For a complete reference, please see the online documentation at\n  # https://docs.vagrantup.com.\n

As you've already ran the box as explained in the previous section, you can see that there's no necessity to tweak anything inside Vagrantfile. The parameters that you can tweak, e.g. the virtual machine's memory or the amount of CPUs you should adapt to your work - e.g. if you need additional resources for developing/running your application, go ahead and increase them. Once that's done, check out if they can be reduced once you know your software resource requirements.

Depending on the task you want to achieve, whether it be a ready-made appliance or a base virtual system that gets provisioned with your application and its dependencies or something else, that's when changes to the specification must be made - e.g. the additional provisioning procedure shall be written.

As the comment quoted above says, refer to the comments the Vagrantfile provided for common options explanation. Once you know their purpose, try them out! Get comfortable with them and read Upstream's documentation for additional info, tips and more advanced, cool possibilities - such as a multi-machine infrastructure defined in a single Vagrantfile.

"},{"location":"jumpstarts/vagrant-jumpstart/#additional-resources","title":"Additional resources","text":""},{"location":"jumpstarts/wsl/","title":"EuroLinux on WSL Jumpstart","text":"

This guide provides a quick overview of setting up EuroLinux on Windows Subsystem for Linux (WSL).

"},{"location":"jumpstarts/wsl/#prerequisites","title":"Prerequisites:","text":""},{"location":"jumpstarts/wsl/#enabling-wsl","title":"Enabling WSL","text":"

Follow the official Microsoft documentation to enable WSL: https://learn.microsoft.com/en-us/windows/wsl/

"},{"location":"jumpstarts/wsl/#about-eurolinux-on-wsl","title":"About EuroLinux on WSL","text":"

EuroLinux company provides EuroLinux version 9 for WSL. The system is based on Red Hat Enterprise Linux 9 and is compatible with it. We used our base container image. The official repository is located https://github.com/EuroLinux/wsl it also contains the build scripts and latest documentation/releases.

"},{"location":"jumpstarts/wsl/#import-and-install-eurolinux-for-wsl","title":"Import and install EuroLinux for WSL","text":""},{"location":"jumpstarts/wsl/#feedback","title":"Feedback","text":"

To provide feedback, request changes, or report bugs, please visit our official RFC/Bug repository at https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc. Your input is highly appreciated!

"},{"location":"knowledge-base/el6-jdk-install-failure/","title":"Unable to install java-1.7.0-openjdk on EuroLinux 6","text":""},{"location":"knowledge-base/el6-jdk-install-failure/#scenario","title":"Scenario","text":"

An attempt to install the latest version of java-1.7.0-openjdk.x86_64 as part of the EuroELS subscription fails with a message like:

Error in PRETRANS scriptlet in rpm package 1:java-1.7.0-openjdk-1.7.0.261-2.6.22.1.el6_10.x86_64\nerror: lua script failed: /usr/libexec/copy_jdk_configs.lua:272: attempt to index global 'file' (a nil value)\n
"},{"location":"knowledge-base/el6-jdk-install-failure/#solution","title":"Solution","text":"

The package java-1.7.0-openjdk.x86_64 expects that the directory /var/lib/rpm-state/ exists. Still, this might not be the case on every installation.

Please create this directory manually:

# mkdir /var/lib/rpm-state/\n
"},{"location":"knowledge-base/eurolinux-6-vault/","title":"Accessing EuroLinux 6.10 Vaulted Repositories","text":""},{"location":"knowledge-base/eurolinux-6-vault/#eurolinux-6-els-eol-2024-06-30","title":"EuroLinux 6 ELS EOL 2024-06-30","text":"

EuroLinux 6 reached its end of life on 2020-11-30; EuroLinux 6 ELS reached EOL on 2024-06-30 and is no longer supported. This means critical security updated are no longer provided, making your system highly vulnerable to security threats.

Upgrading might not always be possible due to reasons like replicating a specific production environment in development, supporting legacy systems, or strict software compatibility requirements. In such cases, while accessing the vaulted repositories is an option, be aware of the inherent security risks.

"},{"location":"knowledge-base/eurolinux-6-vault/#eurolinux-6-vault","title":"EuroLinux 6 vault","text":"

Using the following gist is a straightforward way to access the EuroLinux 6 vault:

Or manually add the following to /etc/yum.repos.d/eurolinux-6-vault-repos.repo:

[eurolinux6-base]\nname=Eurolinux 6 Base Vault\nbaseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/6/6.10/BaseOS/x86_64/os/\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux\n\n[eurolinux6-extras]\nname=Eurolinux 6 Updates Vault\nbaseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/6/6.10/Extras/x86_64/os/\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux\n

If the GPG key is not present on your system, you can add it with the following command:

curl -o /etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux https://fbi.cdn.euro-linux.com/security/RPM-GPG-KEY-eurolinux\n
"},{"location":"knowledge-base/eurolinux-6-vault/#removing-subscription-packages","title":"Removing subscription packages","text":"

Previously, due to EuroLinux 6 repositories being paywalled, a subscription was required. This involved tools like rhn_register or el_register alongside the EuroMan service or a local mirror. With EuroMan's sunsetting alongside EuroLinux 6 ELS EOL, these subscription-related packages are no longer necessary (unless using custom Spacewalk/EuroMan Forman/EuroMan). You can safely remove them using the following command:

sudo yum remove -y rhn* subscription*\n
"},{"location":"knowledge-base/eurolinux-7-vault/","title":"Using EuroLinux 7 from vaulted repositories","text":""},{"location":"knowledge-base/eurolinux-7-vault/#eurolinux-7-eol-2024-06-30","title":"EuroLinux 7 EOL 2024-06-30","text":"

EuroLinux 7 reached its end of life on 2024-06-30. It means no further updates, including security updates, will be available. We strongly recommend upgrading to EuroLinux 8 or later as soon as possible. However, you may still need to use the older version for development, legacy, and compatibility reasons.

"},{"location":"knowledge-base/eurolinux-7-vault/#eurolinux-7-vault","title":"EuroLinux 7 vault","text":"

Using the following gist is a straightforward way to access the EuroLinux 7 vault:

Or manually add the following to /etc/yum.repos.d/eurolinux-7-vault-repos.repo:

[eurolinux7-base]\nname=Eurolinux 7 Base Vault\nbaseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/7/7.9/os/\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7\n\n[eurolinux7-updates]\nname=Eurolinux 7 Updates Vault\nbaseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/7/7.9/updates/\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7\n

The GPG key should be available in the system, but if it is not, you can add it with the following:

curl -o /etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7 https://fbi.cdn.euro-linux.com/security/RPM-GPG-KEY-eurolinux7\n
"},{"location":"knowledge-base/eurolinux-7-vault/#eurolinux-78-and-77","title":"EuroLinux 7.8 and 7.7","text":"

As a bonus, you could also use even older versions of EuroLinux 7.8 and 7.7, which contain only updates up to the last minor release of the given version. Sample content of the .repo files are below:

For EuroLinux 7.8:

[eurolinux7-base]\nname=Eurolinux 7.8 Base Vault\nbaseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/7/7.8/os/\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7\n\n[eurolinux7-updates]\nname=Eurolinux 7.8 Updates Vault\nbaseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/7/7.8/updates/\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7\n

For EuroLinux 7.7:

[eurolinux7-base]\nname=Eurolinux 7.8 Base Vault\nbaseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/7/7.7/os/\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7\n\n[eurolinux7-updates]\nname=Eurolinux 7.8 Updates Vault\nbaseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/7/7.7/updates/\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7\n

"},{"location":"knowledge-base/eurolinux-7-vault/#removing-subscription-packages","title":"Removing subscription packages","text":"

Since the EuroLinux 7 repositories were behind the paywall, you used to need the subscription that used rhn_register or el_register commands and ancient EuroMan service or local mirror of the system. EuroMan was sunsetted with EuroLinux 7 EOL.

You can confidently remove the subscription-related packages (as long as you are not using custom Spacewalk/EuroMan Forman/EuroMan) with the following command:

sudo yum remove -y rhn* subscription*\n
"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/","title":"Black Screen After update to EuroLinux 8.10 - EFI problem","text":""},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#background","title":"Background","text":"

We are deeply sorry to inform you that one of the packages in EuroLinux 8.10 created a severe mistake in the boot configuration. The package grub2-efi-x64 was copied from a never-released beta repository, and it was not supposed to be there in that version.

If you updated your system:

The following error might appear after booting your system.

error: file `/EFI/eurolinux/grubx64.efi` Not Found.\n

and other similar errors, like:

StartImage failed\n

Generally speaking, the system won't boot into the bootloader (GRUB). Depending on your UEFI software, you might see different error messages.

Depending on your UEFI software you might be able to boot system normally. If you can boot system you can fix the problem by reinstalling the grub2-efi-x64 package.

"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#when-this-problem-does-not-occur","title":"When this problem does not occur","text":""},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#update-after-may-28th-12-cet","title":"Update after May 28th, 12 CET","text":"

If you are updating your system with a repository synced after May 28, 13 CET, you should not have this problem. The package was removed and overwritten from the repository, and the proper package was added.

"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#updated-but-not-rebooted-system","title":"Updated but not rebooted system","text":"

If you updated but have not rebooted the system -> please reinstall the grub2-efi-x64 package and kernel packages:

sudo yum clean all\nsudo yum reinstall -y `kernel*` `grub2*`\n
"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#iso-files","title":"ISO files","text":"

The ISO files were updated, and the previous ISO was removed. The new ISO is supposed to be released today (May 28th).

"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#revert-from-backupsnapshot","title":"Revert from backup/snapshot","text":"

If you can, please revert from the backup or snapshot to version 8.9. The update process now contains overwritten, updated and proper packages, and this problem will not occur.

"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#rescue-system-with-wrong-efi-from-a-live-cd","title":"Rescue system with wrong EFI from a live CD.","text":"
  1. Download LiveISO CD
  2. Change boot order (if necessary)
  3. Mount ISO/Create ISO on the pendrive
  4. Start system from ISO
  5. Mount the EFI partition
  6. Copy the EFI files
  7. Run system normally
  8. Reinstall kernel-core and grub2-efi-x86
"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#download-liveiso-cd","title":"Download LiveISO CD","text":"

One of the smallest ISO and well-known projects is Rescatux. You can download it from: https://sourceforge.net/projects/rescatux/files/rescatux-0.74/rescatux-0.74.iso/download

You can use different ISOs, such as our Desktop Live or Ubuntu.

"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#change-the-boot-order-if-necessary","title":"Change the boot order (if necessary)","text":"

Changing the boot order might be necessary for both VM and Physical Machines.

"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#mount-isocreate-iso-on-pendrive","title":"Mount ISO/Create ISO on pendrive","text":"

Mount rescue ISO to a VM. For physical machines, create a bootable pendrive with the ISO. The process is similar to creating a bootable pendrive for installation.

After mounting or inserting the pen drive, start the rescue/live CD system.

"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#starting-rescuetux-or-other-livecd","title":"Starting rescuetux or other livecd","text":"

You can safely start Rescuetux or another live CD. The process is similar to getting a standard desktop. You can safely skip any questions and programs and get straight to the terminal.

"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#find-and-mount-the-efi-partition","title":"Find and mount the EFI partition","text":"

Finding an EFI partition is quite straightforward use one of the following commands:

sudo lsblk\n

Example efi partition output

/dev/nvme0n1p5: UUID=\"2A1E-AC26\" TYPE=\"vfat\" PARTLABEL=\"EFI System Partition\" PARTUUID=\"6b15bd77-bb2e-4393-9fbb-445625660679\"\n

or

lsblk -f\n
Example EFI partition output

vda1 vfat               776-93D0\n

After finding the EFI partition, mount it to a temporary location. In the example bellow, we are using /mnt as a temporary location, and partition is the /dev/vda1

sudo mount /dev/vda1 /mnt\n

Confirm the EFI partition is mounted correctly and contains EFI directory

cd /mnt/\nls\n

The output should contains at least an EFI directory

EFI\n
"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#copy-the-efi-files","title":"Copy the EFI files","text":"
sudo cp -r /mnt/EFI/redhat/* /mnt/EFI/eurolinux/.\n
"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#reboot-system","title":"Reboot system","text":"

Depending on the live CD/ISO you used, you might need to reboot the system or exit the live CD.

sudo reboot\n
in most cases, is enough. You can also shut down the system with shutdown -h now.

Before starting the EuroLinux system, remember to remove the rescue/LiveCD ISO ISO or pendrive.

The whole process is as simple as the one on the screenshot:

"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#running-the-system-and-reinstalling-the-packages","title":"Running the system and reinstalling the packages","text":"

After rebooting the system you should be able to boot into the system in normall state. You can now reinstal the kernel and grub packages.

sudo yum clean all\nsudo yum reinstall -y `kernel*` `grub2*`\n

"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#summary","title":"Summary","text":"

Once more, we are deeply sorry for the inconvenience. The bug skipped our testing and escaped into the public as we were changing the test structure to support new features, including Secure Boot for EuroLinux 9.

We are working on improving our testing process to avoid such mistakes in the future.

If you have any questions or need help, please contact us at support at euro-linux.com. We will dispatch an engineer for a one-on-one session to assist you.

"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/","title":"EuroLinux Linux distribution capabilities and limits","text":"

This document describes the technology capabilities and limits for EuroLinux 6, 7, 8 and 9. Some are theoretical, as they are connected with source code/projects used in the system. Minimal limits represent limits for the systems for which support is generally available by the EuroLinux company. Our dedicated solutions like:

might run and be supported on the less resources than described in this document.

The theoretical limit (connected with a version of the software used) is marked as (LIMIT), when limit supported and tested by upstream is provided as default for EuroLinux. TBA means - To Be Announced.

"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/#minimum-logical-cpu","title":"Minimum logical CPU","text":"

All systems, physical or virtual, require at minimum 1 logical (physical or virtual) CPU core.

"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/#maximum-logical-cpu","title":"Maximum logical CPU","text":"Architecture EuroLinux 6 EuroLinux 7 EuroLinux 8 EuroLinux 9 x86_64 448 (4096) 768 (5120) 768 (8192) 1792 (8192) ARM64 X X 256 512 (4096)"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/#minimum-memory","title":"Minimum memory","text":"

These requirements are only for systems supported as VMs or Physical hosts. In most cases, it's possible to run a system without complications on less memory. The minimum requirements have been provided below because it might not be possible to support systems with less memory.

Architecture EuroLinux 6 EuroLinux 7 EuroLinux 8 EuroLinux 9 x86_64 Minimum 1 GiB, 1 GiB per logical core is recommended Minimum 1 GiB, 1 GiB per logical core is recommended Minimum 1 GiB, 1.5 GiB per logical core is recommended Minimum 1.5 GiB, 1.5 GiB per logical core is recommended ARM64 X X 2GiB 2GiB"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/#maximum-memory","title":"Maximum memory","text":"Architecture EuroLinux 6 EuroLinux 7 EuroLinux 8 EuroLinux 9 x86_64 12TB (64TB) 12TB (64TB) 24TB (64TB) 48TB (64TB) ARM64 X X 1.5TB (256TB) 1.5TB (256TB)"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/#minimum-required-disk-space","title":"Minimum required disk space","text":"EuroLinux 6 EuroLinux 7 EuroLinux 8 EuroLinux 9 1Gib Minimum, 5GiB recommended 5 GiB Minimum, 20 GiB recommended 10 GiB Minimum, 20 GiB recommended 10 GiB Minimum, 20 GiB recommended"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/#file-systems-and-storage-limits","title":"File systems and storage limits","text":"

All filesystems in this document support ACL (Access Control List).

"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/#ext3","title":"Ext3","text":"

Ext3 is mostly a legacy filesystem. Please use Ext4 or XFS.

Feature EuroLinux 6 EuroLinux 7 EuroLinux 8 EuroLinux 9 Maximum File Size 2TiB 2TiB 2TiB 2TiB Maximum Filesystem Size 16TiB 16TiB 16TiB 16TiB Maximum Subdirectories or files in directory 32000 32000 32000 32000 Maximum symlink depth 8 8 8 8"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/#ext4","title":"Ext4","text":"

Ext4 is the default filesystem for EuroLinux 6.

Feature EuroLinux 6 EuroLinux 7 EuroLinux 8 EuroLinux 9 Maximum File Size 16TiB 16TiB 16TiB 16TiB Maximum Filesystem Size 1EiB 1EiB 1EiB 1EiB Maximum Subdirectories or files in directory 65000/unlimited with dir_nlink option 65000/unlimited with dir_nlink option 65000/unlimited with dir_nlink option 65000/unlimited with dir_nlink option Maximum symlink depth 8 8 8 8"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/#xfs","title":"XFS","text":"

XFS is the default filesystem for in EuroLinux 7, 8 and 9.

Feature EuroLinux 6 EuroLinux 7 EuroLinux 8 EuroLinux 9 Maximum File Size 8EiB 8EiB 8EiB 8EiB Maximum Filesystem Size 16EiB 16EiB 1PiB 1PiB Maximum Subdirectories or files in directory unlimited unlimited unlimited unlimited Maximum symlink depth 8 8 8 8"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/#gfs2","title":"GFS2","text":"

Global Filesystem 2 is part of EuroLinux Resilient Storage and High Availability add-ons that are freely available with subscription or free available in the Open Core model.

Feature EuroLinux 6 EuroLinux 7 EuroLinux 8 EuroLinux 9 Maximum File Size 8EiB 8EiB 8EiB 8EiB Maximum Filesystem Size 8EiB 8EiB 8EiB 8EiB Maximum Subdirectories or files in directory unlimited unlimited unlimited unlimited Maximum symlink depth unlimited unlimited unlimited unlimited"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/#kernel-and-the-most-important-components-versions","title":"Kernel and the most important components versions","text":"Feature EuroLinux 6 EuroLinux 7 EuroLinux 8 EuroLinux 9 Base Linux Kernel version 2.6.34 3.10 4.18 5.14 Package Management RPM/Yum RPM/Yum RPM/Dnf, Flatpak RPM/Dnf, Flatpak System Init Upstart systemd systemd systemd Base GNU C Library (glibc) Version 2.12 2.17 2.28 2.34 Base (First) GCC version 4.4.7 4.8.5 8.2.1 (updated in newer versions) 11.2.1 (might be updated in the future) Base (First) LLVM version X X 7.0.1 (updated in newer versions) 13.0.0 (might be updated in the future) Default Desktop Gnome 2 Gnome 3 Gnome 3 Gnome 40 Office Suite LibreOffice LibreOffice LibreOffice LibreOffice Default Web Browser Firefox Firefox Firefox Firefox Default Mail Client Thunderbird Evolution or Thunderbird Evolution or Thunderbird Evolution or Thunderbird"},{"location":"knowledge-base/eurolinux-vault-policy/","title":"EuroLinux Vault and Archiving Policy","text":""},{"location":"knowledge-base/eurolinux-vault-policy/#vault-vaultcdneuro-linuxcom","title":"Vault - vault.cdn.euro-linux.com","text":"

The idea of the vault is simple - it stores older or archived versions of the software packages (mostly RPMs) and allow to create and maintain the environment that requires old versions of the packages, specific libraries or cannot or even must not be updated.

Warning! Security considerations

Due to their nature, the old versions of the software contain security vulnerabilities. Many of them have ready and easy to use exploits. Using unsupported versions of software is a dangerous practice, especially when system is running in the public networks.

"},{"location":"knowledge-base/eurolinux-vault-policy/#vaults-initial-and-last-version-for-minor-releases","title":"Vault's initial and last version for minor releases","text":"

From version 8.6 and 9.0 we decided that we will provide three versions for each minor release (minor release is for example EuroLinux 8.6 -> 8.7 -> 8.8), of the vault. The first one is the initial state of the release, then there is current state (for living release), the third one has '-last' and it's the last snapshot before a new minor release. This idea originated from community feedback. For example in case of EuroLinux 8.7 (that in time of writing this documentation is the latest minor release):

If there is no version with -last suffix it means that this version is a newest minor release or the -last was not created.

"},{"location":"knowledge-base/eurolinux-vault-policy/#vault-for-the-current-version","title":"Vault for the current version","text":"

For your convince EuroLinux Vault also keeps the track of the current version of the EuroLinux as a symbolic link to the newest minor release. The symlinks are 8 for version 8 and 9 for version 9.

These repositories are updated regularly in the same manner as main/mirrors repositories.

"},{"location":"knowledge-base/eurolinux-vault-policy/#eurolinux-sources-on-vaultcdneuro-linuxcom","title":"EuroLinux sources on vault.cdn.euro-linux.com","text":"

We used to provide sources for EuroLinux on GitHub. Unfortunately, due to GitHub's limitations, it wasn't as feasible in long run. Each source needed to be repacked on the client system and source wasn't signed.

We decided to go with a friendlier and more standarized direction after receiving feedback from the community and clients. Since version 8 we deliver the sources as .src.rpms. It's a better solution in many ways, and the advantages include:

The source can be found at https://vault.cdn.euro-linux.com/sources/eurolinux/.

"},{"location":"knowledge-base/eurolinux-vault-policy/#bug-tracker","title":"Bug tracker","text":"

If you encounter any missing sources or problem with vault, please don't hesitate to contact as via e-mail (support[at]euro-linux.com) or fill bug in our distro bug tracker. If you are our client you can contact us on the support site or with sale representative.

"},{"location":"knowledge-base/unable-to-find-requested-software/","title":"Unable to Find Requested Software","text":""},{"location":"knowledge-base/unable-to-find-requested-software/#environment","title":"Environment","text":""},{"location":"knowledge-base/unable-to-find-requested-software/#issue","title":"Issue","text":"

An error occurs during a search for missing components. A similar message is shown by GNOME Software:

Unfortunately, the [...] you were searching for could not be found. Please see [...] for more information.

"},{"location":"knowledge-base/unable-to-find-requested-software/#missing-package","title":"Missing Package","text":"

The package you are searching for is not available in EuroLinux base repositories.

"},{"location":"knowledge-base/unable-to-find-requested-software/#missing-codec","title":"Missing Codec","text":"

The codec you are searching for is not available in EuroLinux base repositories due to licensing reasons or patent encumbrance.

"},{"location":"knowledge-base/unable-to-find-requested-software/#missing-hardware-support","title":"Missing Hardware Support","text":"

A kernel module or a driver is not available in EuroLinux base repositories due to licensing reasons that prohibit redistribution or is not yet in the upstream Linux kernel.

"},{"location":"knowledge-base/unable-to-find-requested-software/#missing-font","title":"Missing Font","text":"

The font you are searching for is not available in EuroLinux base repositories.

"},{"location":"knowledge-base/unable-to-find-requested-software/#missing-mime-support","title":"Missing MIME Support","text":"

An application that supports operations on your file with its MIME type is not available in EuroLinux base repositories due to them being supported exclusively by a third party application or an application that runs only on a platform different than EuroLinux.

"},{"location":"knowledge-base/unable-to-find-requested-software/#resolution","title":"Resolution","text":"

If you would like to request for a certain component availability, please contact us.

"},{"location":"release-notes/8.10/","title":"EuroLinux 8.10 Release Notes","text":"

This version\u2019s code name is Bucharest - the capital of Romania, also known as \u201cParis of the East\u201d.

"},{"location":"release-notes/8.10/#major-changes-in-eurolinux-810","title":"Major changes in EuroLinux 8.10.","text":""},{"location":"release-notes/8.10/#security","title":"Security","text":"

Key security-related highlights:

"},{"location":"release-notes/8.10/#programming-languages-web-and-database-servers","title":"Programming languages, web and database servers","text":"

Later versions of the following application are now available:

The following components have been upgraded:

"},{"location":"release-notes/8.10/#compilers-and-development-tools","title":"Compilers and development tools","text":""},{"location":"release-notes/8.10/#updated-performance-tools-and-debuggers","title":"Updated performance tools and debuggers","text":"

The following performance tools and debuggers have been updated:

"},{"location":"release-notes/8.10/#updated-compiler-toolsets","title":"Updated compiler toolsets","text":"

The following compiler toolsets have been updated:

"},{"location":"release-notes/8.10/#java-implementations-in-eurolinux-8","title":"Java implementations in EuroLinux 8","text":"

The EuroLinux 8 AppStream repository includes:

"},{"location":"release-notes/8.10/#batteries-repositories","title":"Batteries repositories","text":"

Batteries repository contains packages that are needed to rebuild the distribution but are not included in any upstream repositories. Right now, this repository includes more than 3000 packages for each buildroot.

"},{"location":"release-notes/8.10/#known-issues","title":"Known issues","text":""},{"location":"release-notes/8.10/#gaia-build-system","title":"Gaia build system","text":"

We are currently using Gaia 3.0 and preparing 4.0 with branding kit.

"},{"location":"release-notes/8.10/#container-and-cloud-images","title":"Container and cloud images","text":"

You can use the following publicly available images for EuroLinux 8:

"},{"location":"release-notes/8.10/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.3/","title":"EuroLinux 8.3 Release Notes","text":""},{"location":"release-notes/8.3/#dynamic-programming-languages","title":"Dynamic programming languages","text":"

Later versions of the following components are now available:

"},{"location":"release-notes/8.3/#web-and-database-servers","title":"Web and Database servers","text":"

Later versions of the following components are now available

"},{"location":"release-notes/8.3/#compiler-toolsets","title":"Compiler toolsets","text":"

The following compiler toolsets have been updated in EL 8.3:

"},{"location":"release-notes/8.3/#security","title":"Security","text":""},{"location":"release-notes/8.3/#general-updates-and-improvements","title":"General updates and improvements","text":""},{"location":"release-notes/8.3/#identity-management","title":"Identity Management","text":"

The Rivest Cipher 4 (RC4) cipher suite, the default encryption type for users, services, and trusts between Active Directory domains in an Active Directory forest, has been deprecated in EuroLinux 8. For compatibility, this release introduces cryptographic subpolicy named AD-SUPPORT to enable support for this deprecated encryption type. The new subpolicy allows you to use RC4 with EuroLinux IPA and SSSD Active Directory.

"},{"location":"release-notes/8.3/#the-web-console","title":"The web console","text":"

The cockpit web console provides an option to switch between superuser access and limited access from inside of a user session.

"},{"location":"release-notes/8.3/#desktop-and-graphics","title":"Desktop and graphics","text":"

The Direct Rendering Manager (DRM) kernel graphics subsystem has been rebased to upstream Linux kernel version 5.6. It provides a number of enhancements over the previous versions, including support for new GPUs and APUs.

"},{"location":"release-notes/8.4-beta/","title":"EuroLinux Beta 8.4 Release Notes","text":""},{"location":"release-notes/8.4-beta/#dynamic-programming-languages","title":"Dynamic programming languages","text":"

Later versions of the following components are now available:

"},{"location":"release-notes/8.4-beta/#web-and-database-servers","title":"Web and Database servers","text":"

Later versions of the following components are now available:

"},{"location":"release-notes/8.4-beta/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.4:

There is new a module containing Persistent Memory Development Kit (PMDK):

"},{"location":"release-notes/8.4-beta/#security","title":"Security","text":""},{"location":"release-notes/8.4-beta/#general-updates-and-improvements","title":"General updates and improvements","text":""},{"location":"release-notes/8.4-beta/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild distribution but are not included in upstream repositories. Right now, this repository includes more than 2000 packages for each buildroot.

Multiple batteries were updated for this release there including:

"},{"location":"release-notes/8.4-beta/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.4/","title":"EuroLinux 8.4 Release Notes","text":""},{"location":"release-notes/8.4/#dynamic-programming-languages","title":"Dynamic programming languages","text":"

Later versions of the following components are now available:

"},{"location":"release-notes/8.4/#web-and-database-servers","title":"Web and Database servers","text":"

Later versions of the following components are now available:

"},{"location":"release-notes/8.4/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.4:

There is new a module containing Persistent Memory Development Kit (PMDK):

"},{"location":"release-notes/8.4/#security","title":"Security","text":""},{"location":"release-notes/8.4/#general-updates-and-improvements","title":"General updates and improvements","text":""},{"location":"release-notes/8.4/#how-to-update-from-beta","title":"How to update from beta","text":"

The beta repository has an updated package el-release, that contains production repositories. Upgrading from EuroLinux 8.4 beta to 8.4 is as simple as running:

sudo yum update -y el-release\nsudo yum update -y\n
"},{"location":"release-notes/8.4/#branded-packages","title":"Branded packages","text":"

Multiple packages have names changed due to branding, including:

All these packages have proper RPM provides declaration.

The list of the packages that are changed due to branding includes, among the others:

"},{"location":"release-notes/8.4/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild distribution but are not included in upstream repositories. Right now, this repository contains more than 2000 packages for each buildroot.

Multiple batteries were updated for this release there including:

"},{"location":"release-notes/8.4/#other-notable-changes","title":"Other notable changes","text":""},{"location":"release-notes/8.4/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.5-arm64/","title":"EuroLinux 8.5 Release Notes for ARM 64 (aarch64)","text":"

EuroLinux 8.5 is the first version of EuroLinux that provides ARM 64 General Availability. We have to update the Gaia build system in the customers' sites for this release. This version code name is Tirana - the capital city of Albania.

Below you can find the essential changes in EuroLinux 8.5 GA release for aarch64 architecture from EuroLinux 8.4 Beta for ARM64.

"},{"location":"release-notes/8.5-arm64/#dynamic-programming-languages-web-and-database-servers","title":"Dynamic programming languages, Web and Database servers","text":"

New versions of the following components are now available:

"},{"location":"release-notes/8.5-arm64/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.5:

"},{"location":"release-notes/8.5-arm64/#security","title":"Security","text":"

Most of the security features are connected to rebased/updated versions of the packages. The most crucial security changes include:

"},{"location":"release-notes/8.5-arm64/#high-availability-and-resilient-storage","title":"High Availability and Resilient Storage","text":""},{"location":"release-notes/8.5-arm64/#general-updates-and-improvements","title":"General updates and improvements","text":"

Among the others, the following packages were updated and enhanced:

"},{"location":"release-notes/8.5-arm64/#new-packages","title":"New packages","text":"

Among the others, the following packages were added to this release:

"},{"location":"release-notes/8.5-arm64/#how-to-update-from-beta","title":"How to update from beta","text":"

The beta repository has an updated package el-release, that contains production repositories. Upgrading from EuroLinux 8.4 beta for ARM64 to 8.5 GA is as simple as running:

sudo yum update -y el-release\nsudo yum update -y\n
"},{"location":"release-notes/8.5-arm64/#branded-packages","title":"Branded packages","text":"

Multiple packages have names changed due to branding, including:

All these packages have proper RPM provides declaration.

The list of the packages that are changed due to branding includes, among the others:

"},{"location":"release-notes/8.5-arm64/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild the distribution but are not included in upstream repositories. Right now, this repository includes more than 2100 packages for each buildroot.

Multiple batteries were updated for this release there, including:

"},{"location":"release-notes/8.5-arm64/#gaia-build-system","title":"Gaia build system","text":"

Gaia build system was updated in all interested parties' environments. We had to select/order (with current long delivery times)/install hardware for aarch64. We also changed the rebuild policy. None of our customers was interested in using RHEL as a buildroot for their own Enterprise Linux forks. It means that EuroLinux must be released faster, but at the very same time, we can exclusively focus on providing EuroLinux in the early stages and thus release it faster. We also decided that the next version will be released asynchronously with more batch compilation. Batch compilation is scheduled for EuroLinux 9.0 and 8.6.

"},{"location":"release-notes/8.5-arm64/#other-notable-changes","title":"Other notable changes","text":""},{"location":"release-notes/8.5-arm64/#currently-missing-features","title":"Currently missing features","text":""},{"location":"release-notes/8.5-arm64/#container-and-cloud-images","title":"Container and cloud images","text":"

We will work on broader support for cloud/container images based on EuroLinux 8.5 for arm including:

"},{"location":"release-notes/8.5-arm64/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.5/","title":"EuroLinux 8.5 Release Notes","text":"

EuroLinux 8.5 is the first minor release created in a continuous way. It was also the first version when we deployed our engineer to remote sites (in most cases virtual) to provide support for organisations that rebuild RHEL/EuroLinux from sources with Gaia build system. This version code name is Tirana - the capital city of Albania.

Below you can find the essential changes in EuroLinux 8.5 release for x86_64 architecture. The aarch64 GA release is slightly delayed. Release notes for aarch64 will be provided in a separate document.

"},{"location":"release-notes/8.5/#dynamic-programming-languages-web-and-database-servers","title":"Dynamic programming languages, Web and Database servers","text":"

New versions of the following components are now available:

"},{"location":"release-notes/8.5/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.5:

"},{"location":"release-notes/8.5/#security","title":"Security","text":"

Most of the security features are connected to rebased/updated versions of the packages. The most crucial security changes include:

"},{"location":"release-notes/8.5/#high-availability-and-resilient-storage","title":"High Availability and Resilient Storage","text":""},{"location":"release-notes/8.5/#general-updates-and-improvements","title":"General updates and improvements","text":"

Among the others, the following packages were updated and enhanced:

"},{"location":"release-notes/8.5/#new-packages","title":"New packages","text":"

Among the others, the following packages were added to this release:

"},{"location":"release-notes/8.5/#how-to-update-from-beta","title":"How to update from beta","text":"

The beta repository has an updated package el-release, that contains production repositories. Upgrading from EuroLinux 8.5 beta to 8.5 is as simple as running:

sudo yum update -y el-release\nsudo yum update -y\n
"},{"location":"release-notes/8.5/#branded-packages","title":"Branded packages","text":"

Multiple packages have names changed due to branding, including:

All these packages have proper RPM provides declaration.

The list of the packages that are changed due to branding includes, among the others:

"},{"location":"release-notes/8.5/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild the distribution but are not included in upstream repositories. Right now, this repository includes more than 2100 packages for each buildroot.

Multiple batteries were updated for this release there including:

"},{"location":"release-notes/8.5/#gaia-build-system","title":"Gaia build system","text":"

Gaia build system was updated in all interested parties' environments. We also changed the rebuild policy. None of our customers was interested in using RHEL as a buildroot for their own Enterprise Linux forks. It means that EuroLinux must be released faster, but at the very same time, we can exclusively focus on providing EuroLinux in the early stages and thus release it faster. We also decided that the next version will be released asynchronously with more batch compilation. Synchronization was especially problematic in this release as there was a lot of holidays in Poland.

"},{"location":"release-notes/8.5/#other-notable-changes","title":"Other notable changes","text":""},{"location":"release-notes/8.5/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.6-beta/","title":"EuroLinux 8.6 Beta Release Notes","text":"

EuroLinux 8.6 is the first minor release with a full-fledged beta available before the General Availability of the upstream version (RHEL 8.6). The Beta version will allow releasing EuroLinux 8.6 GA faster. We decided to publish x86_64 and corresponding x86_64, i686 open buildroots for this beta. The GA version will release all supported arches simultaneously.

This version\u2019s code name is Kyiv - the capital city of Ukraine.

"},{"location":"release-notes/8.6-beta/#dynamic-programming-languages-web-and-database-servers","title":"Dynamic programming languages, Web and Database servers","text":"

New versions of the following components are now available:

"},{"location":"release-notes/8.6-beta/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.6:

"},{"location":"release-notes/8.6-beta/#containers","title":"Containers","text":""},{"location":"release-notes/8.6-beta/#security","title":"Security","text":"

Most of the security features are connected to rebased/updated versions of the packages. The most crucial security changes include:

"},{"location":"release-notes/8.6-beta/#general-updates-and-improvements","title":"General updates and improvements","text":"

Among the others, the following packages were updated and enhanced:

"},{"location":"release-notes/8.6-beta/#new-packages","title":"New packages","text":"

Among the others, the following packages were added to os repository for this release:

"},{"location":"release-notes/8.6-beta/#branded-packages","title":"Branded packages","text":"

Multiple packages have names changed due to branding, including:

All these packages have proper RPM provides declaration.

The list of the packages that are changed due to branding includes, among the others:

"},{"location":"release-notes/8.6-beta/#removed-packages","title":"Removed packages","text":"

The following packages were removed:

"},{"location":"release-notes/8.6-beta/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild the distribution but are not included in any upstream repositories. Right now, this repository includes more than 2500 packages for each buildroot.

Multiple batteries were updated for this release including:

About 420 packages were updated for x86_64 buildroot alone.

"},{"location":"release-notes/8.6-beta/#gaia-build-system","title":"Gaia build system","text":"

We are still working on Gaia 3.0.

"},{"location":"release-notes/8.6-beta/#known-bugs","title":"Known bugs","text":""},{"location":"release-notes/8.6-beta/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.6/","title":"EuroLinux 8.6 Release Notes","text":"

Since EuroLinux 8.6 was first minor release with a full-fledged beta available before the General Availability of the upstream version (RHEL 8.6), the Beta version allowed us to release EuroLinux 8.6 faster.

This version\u2019s code name is Kyiv - the capital city of Ukraine.

"},{"location":"release-notes/8.6/#dynamic-programming-languages-web-and-database-servers","title":"Dynamic programming languages, Web and Database servers","text":"

New versions of the following components are now available:

"},{"location":"release-notes/8.6/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.6:

"},{"location":"release-notes/8.6/#containers","title":"Containers","text":""},{"location":"release-notes/8.6/#security","title":"Security","text":"

Most of the security features are connected to rebased/updated versions of the packages. The most crucial security changes include:

"},{"location":"release-notes/8.6/#general-updates-and-improvements","title":"General updates and improvements","text":"

Among the others, the following packages were updated and enhanced:

"},{"location":"release-notes/8.6/#new-packages","title":"New packages","text":"

Among the others, the following packages were added to os repository for this release:

"},{"location":"release-notes/8.6/#branded-packages","title":"Branded packages","text":"

Multiple packages have names changed due to branding, including:

All these packages have proper RPM provides declaration.

The list of the packages that are changed due to branding includes, among the others:

"},{"location":"release-notes/8.6/#removed-packages","title":"Removed packages","text":"

The following packages were removed:

"},{"location":"release-notes/8.6/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild the distribution but are not included in any upstream repositories. Right now, this repository includes more than 2500 packages for each buildroot.

Multiple batteries were updated for this release including:

About 420 packages were updated for x86_64 buildroot alone.

"},{"location":"release-notes/8.6/#gaia-build-system","title":"Gaia build system","text":"

We are still working on Gaia 3.0.

"},{"location":"release-notes/8.6/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.7-beta/","title":"EuroLinux 8.7 Beta Release Notes","text":"

EuroLinux 8.7 is the first beta release for x86_64 and aarch64 beta published concurrently. The Beta version will allow us to provide EuroLinux 8.7 faster.

This version\u2019s code name is Brussels - the capital city of Belgium and the heart of European Union.

Older modules removed

In this beta we noticed that a lot of modules were obsoleted or removed, we are waiting for GA version to confirm that there will be a mechanism that should allow smoother migration between modules or that these modules will be available.

"},{"location":"release-notes/8.7-beta/#dynamic-programming-languages-web-and-database-servers","title":"Dynamic programming languages, Web and Database servers","text":"

New versions of the following components are now available:

"},{"location":"release-notes/8.7-beta/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.7:

"},{"location":"release-notes/8.7-beta/#containers","title":"Containers","text":""},{"location":"release-notes/8.7-beta/#security","title":"Security","text":"

Most of the security features are connected to rebased/updated versions of the packages. The most crucial security changes include:

"},{"location":"release-notes/8.7-beta/#general-updates-and-improvements","title":"General updates and improvements","text":"

Among the others, the following packages were updated and enhanced:

"},{"location":"release-notes/8.7-beta/#new-packages","title":"New packages","text":"

Among the others, the following packages were added to os repository for this release:

"},{"location":"release-notes/8.7-beta/#branded-packages","title":"Branded packages","text":"

Multiple packages have names changed due to branding, including:

All these packages have proper RPM provides declaration.

The list of the packages that are changed due to branding includes, among the others:

"},{"location":"release-notes/8.7-beta/#removed-packages","title":"Removed packages","text":"

The following packages were removed:

"},{"location":"release-notes/8.7-beta/#maven-38","title":"Maven 3.8","text":"

Maven 3.8 - module maven stream 3.8 was not introduced in this beta. Currently upstream didn't provide modules metadata for javapackages-tools:202201 and javapackages-bootstrap:202201 that are required to build Maven 3.8. The default profile for javapackages-tools:202201 is available in the Red Hat CodeReady-Builder repository but there is no modular metadata or RPMs.

We manage to create this module in not reproducible way and in worst case scenario we will provide specially crafted VM to build it for orgs that are using Gaia Build System. We decided not to put this module as we are rebuilding EuroLinux multiple times and not reproducible rebuilds are next to impossible to maintain.

"},{"location":"release-notes/8.7-beta/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild the distribution but are not included in any upstream repositories. Right now, this repository includes more than 2500 packages for each buildroot.

About 30 packages were updated for x86_64 buildroot.

"},{"location":"release-notes/8.7-beta/#gaia-build-system","title":"Gaia build system","text":"

We are currently using Gaia 3.0 alpha.

"},{"location":"release-notes/8.7-beta/#eurolinux-91-beta","title":"EuroLinux 9.1 beta","text":"

As we released a brand new EuroLinux Desktop we are working on better test integrations with EuroLinux 9. This process takes time. We should deliver EuroLinux 9.1 beta before EuroLinux 9.1 GA.

"},{"location":"release-notes/8.7-beta/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.7/","title":"EuroLinux 8.7 Release Notes","text":"

This version\u2019s code name is Brussels - the capital city of Belgium and the heart of European Union.

"},{"location":"release-notes/8.7/#dynamic-programming-languages-web-and-database-servers","title":"Dynamic programming languages, Web and Database servers","text":"

New versions of the following components are now available:

"},{"location":"release-notes/8.7/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.6:

"},{"location":"release-notes/8.7/#containers","title":"Containers","text":""},{"location":"release-notes/8.7/#security","title":"Security","text":"

Most of the security features are connected to rebased/updated versions of the packages. The most crucial security changes include:

"},{"location":"release-notes/8.7/#general-updates-and-improvements","title":"General updates and improvements","text":"

Among the others, the following packages were updated and enhanced:

"},{"location":"release-notes/8.7/#new-packages","title":"New packages","text":"

Among the others, the following packages were added to os repository for this release:

"},{"location":"release-notes/8.7/#branded-packages","title":"Branded packages","text":"

Multiple packages have names changed due to branding, including:

All these packages have proper RPM provides declaration.

The list of the packages that are changed due to branding includes, among the others:

"},{"location":"release-notes/8.7/#removed-packages","title":"Removed packages","text":"

The following packages were removed:

"},{"location":"release-notes/8.7/#new-vault-policy","title":"New vault policy","text":"

With feedback from community we decided to add the -last to the EuroLinux 8.6 vaulted versions that represents the last snapshot of the EuroLinux 8.6. More about vault policy here.

"},{"location":"release-notes/8.7/#smaller-base-repositories","title":"Smaller base repositories","text":"

Until now we keeped all produced versions of the same package in base repositories. Upstream policy is to keep only selected versions and the rest in the vaults. It is reasonable as saves a internet bandwith, and put much less stress on the mirroring sites. From EuroLinux 8.7 we will aim to use upstream schema for packages.

Older packages are still available at EuroLinux Vault.

"},{"location":"release-notes/8.7/#installation-from-baseurl-with-treeinfo","title":"Installation from baseurl with .treeinfo","text":"

EuroLinux 8.7 is first release that officially supports the installation from URL leveraging .treeinfo files.

"},{"location":"release-notes/8.7/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild the distribution but are not included in any upstream repositories. Right now, this repository includes more than 2500 packages for each buildroot.

About 30 packages were updated for x86_64 buildroot.

"},{"location":"release-notes/8.7/#gaia-build-system","title":"Gaia build system","text":"

Gaia build system is still in the 3.0 alpha.

"},{"location":"release-notes/8.7/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.8-beta/","title":"EuroLinux 8.8 Beta Release Notes","text":"

This version\u2019s code name is Sofia - the capital city of Bulgaria. The Beta version will allow us to provide EuroLinux 8.8 faster.

Major changes in EuroLinux 8.8 Beta:

"},{"location":"release-notes/8.8-beta/#dynamic-programming-languages-web-and-database-servers","title":"Dynamic programming languages, Web and Database servers","text":"

New versions of the following components are now available:

The following components have been upgraded:

"},{"location":"release-notes/8.8-beta/#updated-performance-monitoring-tools","title":"Updated performance monitoring tools","text":"

The following performance monitoring tools have been updated in EuroLinux 8.8:

"},{"location":"release-notes/8.8-beta/#kernel-version","title":"Kernel version","text":"

EuroLinux 8.8 Beta is distributed with the kernel version 4.18.0-477.

"},{"location":"release-notes/8.8-beta/#compilers-and-development-tools","title":"Compilers and development tools","text":"

The following performance tools and debuggers have been updated in EuroLinux 8.8:

"},{"location":"release-notes/8.8-beta/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.8:

"},{"location":"release-notes/8.8-beta/#security","title":"Security","text":"

The most crucial security changes include:

"},{"location":"release-notes/8.8-beta/#general-updates-and-improvements","title":"General updates and improvements","text":""},{"location":"release-notes/8.8-beta/#new-packages","title":"New packages","text":"

Among the others, the following packages were added to os repository for this release:

"},{"location":"release-notes/8.8-beta/#branded-packages","title":"Branded packages","text":"

Multiple packages have names changed due to branding, including:

All these packages have proper RPM provides declaration.

The list of the packages that are changed due to branding includes, among others:

"},{"location":"release-notes/8.8-beta/#removed-packages","title":"Removed packages","text":"

The following packages were removed:

"},{"location":"release-notes/8.8-beta/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild the distribution but are not included in any upstream repositories. Right now, this repository includes more than 3000 packages for each buildroot.

About 150 packages were updated for x86_64 buildroot alone. We also added some of the packages (like python3.11 for i686) to the publicly available open buildroots.

"},{"location":"release-notes/8.8-beta/#known-issues","title":"Known issues","text":""},{"location":"release-notes/8.8-beta/#gaia-build-system","title":"Gaia build system","text":"

We are currently using Gaia 3.0 beta.

"},{"location":"release-notes/8.8-beta/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.8/","title":"EuroLinux 8.8 Release Notes","text":"

This version\u2019s code name is Sofia - the capital city of Bulgaria.

Major changes in EuroLinux 8.8:

"},{"location":"release-notes/8.8/#dynamic-programming-languages-web-and-database-servers","title":"Dynamic programming languages, Web and Database servers","text":"

New versions of the following components are now available:

The following components have been upgraded:

"},{"location":"release-notes/8.8/#updated-performance-monitoring-tools","title":"Updated performance monitoring tools","text":"

The following performance monitoring tools have been updated in EuroLinux 8.8:

"},{"location":"release-notes/8.8/#kernel-version","title":"Kernel version","text":"

EuroLinux 8.8 is distributed with the kernel version 4.18.0-477.

"},{"location":"release-notes/8.8/#compilers-and-development-tools","title":"Compilers and development tools","text":"

The following performance tools and debuggers have been updated in EuroLinux 8.8:

"},{"location":"release-notes/8.8/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.8:

"},{"location":"release-notes/8.8/#security","title":"Security","text":"

The most crucial security changes include:

"},{"location":"release-notes/8.8/#general-updates-and-improvements","title":"General updates and improvements","text":""},{"location":"release-notes/8.8/#new-packages","title":"New packages","text":"

Among the others, the following packages were added to os repository for this release:

"},{"location":"release-notes/8.8/#branded-packages","title":"Branded packages","text":"

Multiple packages have names changed due to branding, including:

All these packages have proper RPM provides declaration.

The list of the packages that are changed due to branding includes, among others:

"},{"location":"release-notes/8.8/#removed-packages","title":"Removed packages","text":"

The following packages were removed:

"},{"location":"release-notes/8.8/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild the distribution but are not included in any upstream repositories. Right now, this repository includes more than 3000 packages for each buildroot.

About 150 packages were updated for x86_64 buildroot alone. We also added some of the packages (like python3.11 for i686) to the publicly available open buildroots.

"},{"location":"release-notes/8.8/#known-issues","title":"Known issues","text":""},{"location":"release-notes/8.8/#gaia-build-system","title":"Gaia build system","text":"

We are currently using Gaia 3.0 beta.

"},{"location":"release-notes/8.8/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.9-beta/","title":"EuroLinux 8.9 Beta Release Notes","text":"

This version\u2019s code name is Monako - a sovereign city-state in France. The Beta version will allow us to provide EuroLinux 8.9 safer and faster.

Major changes in EuroLinux 8.9 Beta:

"},{"location":"release-notes/8.9-beta/#kernel-version","title":"Kernel version","text":"

EuroLinux 8.9 Beta is distributed with the kernel version 4.18.0-513.

"},{"location":"release-notes/8.9-beta/#new-versions-programming-languages-web-and-database-servers","title":"New versions - Programming languages, Web and Database servers","text":"

New versions of the following components are now available:

"},{"location":"release-notes/8.9-beta/#compilers-and-development-tools","title":"Compilers and development tools","text":"

The following performance tools and debuggers have been updated in EuroLinux 8.9 beta:

"},{"location":"release-notes/8.9-beta/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.9 beta:

"},{"location":"release-notes/8.9-beta/#updated-performance-monitoring-tools","title":"Updated performance monitoring tools","text":"

The following performance monitoring tools have been updated in EuroLinux 8.9:

"},{"location":"release-notes/8.9-beta/#security","title":"Security","text":"

The most crucial security changes include:

"},{"location":"release-notes/8.9-beta/#general-updates-and-improvements","title":"General updates and improvements","text":""},{"location":"release-notes/8.9-beta/#new-packages","title":"New packages","text":"

Among the others, the following packages were added to os repositories for this release:

"},{"location":"release-notes/8.9-beta/#branded-packages","title":"Branded packages","text":"

Multiple packages have names changed due to branding, including:

All these packages have proper RPM provides declaration.

The list of the packages that are changed due to branding includes, among others:

"},{"location":"release-notes/8.9-beta/#removed-packages","title":"Removed packages","text":"

The following packages were removed:

"},{"location":"release-notes/8.9-beta/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild the distribution but are not included in any upstream repositories. Right now, this repository includes more than 3000 packages for each buildroot.

About 50 packages were updated for x86_64 buildroot alone. We also added some of the packages (like python3.11 for i686) to the publicly available open buildroots.

"},{"location":"release-notes/8.9-beta/#known-issues","title":"Known issues","text":""},{"location":"release-notes/8.9-beta/#gaia-build-system","title":"Gaia build system","text":"

We are currently using Gaia 3.0 and preparing 4.0 with branding kit.

"},{"location":"release-notes/8.9-beta/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.9/","title":"EuroLinux 8.9 Release Notes","text":"

This version\u2019s code name is Monako - a sovereign city-state in France.

Major changes in EuroLinux 8.9:

"},{"location":"release-notes/8.9/#kernel-version","title":"Kernel version","text":"

EuroLinux 8.9 is distributed with the kernel version 4.18.0-513.

"},{"location":"release-notes/8.9/#new-versions-programming-languages-web-and-database-servers","title":"New versions - Programming languages, Web and Database servers","text":"

New versions of the following components are now available:

"},{"location":"release-notes/8.9/#compilers-and-development-tools","title":"Compilers and development tools","text":"

The following performance tools and debuggers have been updated in EuroLinux 8.9:

"},{"location":"release-notes/8.9/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.9:

"},{"location":"release-notes/8.9/#updated-performance-monitoring-tools","title":"Updated performance monitoring tools","text":"

The following performance monitoring tools have been updated in EuroLinux 8.9:

"},{"location":"release-notes/8.9/#security","title":"Security","text":"

The most crucial security changes include:

"},{"location":"release-notes/8.9/#general-updates-and-improvements","title":"General updates and improvements","text":""},{"location":"release-notes/8.9/#new-packages","title":"New packages","text":"

Among the others, the following packages were added to os repositories for this release:

"},{"location":"release-notes/8.9/#branded-packages","title":"Branded packages","text":"

Multiple packages have names changed due to branding, including:

All these packages have proper RPM provides declaration.

The list of the packages that are changed due to branding includes, among others:

"},{"location":"release-notes/8.9/#removed-packages","title":"Removed packages","text":"

The following packages were removed:

"},{"location":"release-notes/8.9/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild the distribution but are not included in any upstream repositories. Right now, this repository includes more than 3000 packages for each buildroot.

About 50 packages were updated for x86_64 buildroot alone. We also added some of the packages (like python3.11 for i686) to the publicly available open buildroots.

"},{"location":"release-notes/8.9/#known-issues","title":"Known issues","text":""},{"location":"release-notes/8.9/#gaia-build-system","title":"Gaia build system","text":"

We are currently using Gaia 3.0 and preparing 4.0 with branding kit.

"},{"location":"release-notes/8.9/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/9.0-beta/","title":"EuroLinux 9 Beta Release Notes","text":""},{"location":"release-notes/9.0-beta/#technical-changes-between-eurolinux-9-and-8","title":"Technical changes between EuroLinux 9 and 8","text":""},{"location":"release-notes/9.0-beta/#installer-and-image-creation","title":"Installer and image creation","text":"

In EuroLinux 9.0 you can now use a standalone smart card to both authenticate yourself and gain additional privileges via sudo.

For the typical cases of installing EuroLinux with a medium such as a disk interactively a Quality of Life tweak has been implemented: the Anaconda installer will now automatically activate a network connection if applicable (will try to obtain an address via DHCP).

You can now optionally permit a password-based root login via SSH or completely lock the root account in any case. (While the former is not recommended due to security and disabled in EuroLinux 9 by default, there are valid use cases which we support with this single easy switch)

"},{"location":"release-notes/9.0-beta/#administrative-tools","title":"Administrative tools","text":"

If you want to rename a network interface, it is recommended that you use systemd link files. Check man 5 systemd.link for more information.

Alternatively udev rules may be used. If you need to use the ifcfg tool, please install the initscripts package first since it is not installed by default.

"},{"location":"release-notes/9.0-beta/#security","title":"Security","text":"

EuroLinux 9 provides OpenSSL version 3.0.0. Among other things, the concept of providers has been added, which means that different programs can use different security algorithms depending on their needs. You can imagine a situation where you have implemented solutions where one needs to use FIPS mode, while others need to maintain compliance with less secure policies.

This new version comes with a few security-related implications. The TLS-1.3 protocol requires that a PKCS#11 token supports raw RSA or RSA-PSS signatures.

If this is applicable to your scenario, please configure your software to use TLS up to TLS-1.2. Additionally please edit the file /etc/pki/tls/openssl.cnf and add this snippet at the very end of the [ crypto_policy ] section:

SignatureAlgorithms = RSA+SHA256:RSA+SHA512:RSA+SHA384:ECDSA+SHA256:ECDSA+SHA512:ECDSA+SHA384\nMaxProtocol = TLSv1.2\n
"},{"location":"release-notes/9.0-beta/#developer-tools","title":"Developer tools","text":"

Some of the newest and most reliable technology stacks for developers are available in the repositories. These include:

The EuroLinux 9 platform ships glibc 2.34, which will provide 10 years of business-class stability support and the same amount of software binary interface compatibility time. As a result, programs written today will work the same way 10 years from now.

"},{"location":"release-notes/9.0-beta/#web-servers-and-database-engines","title":"Web servers and database engines","text":"

The following software is now available in our repositories:

HTTP servers:

Proxy servers:

Database engines:

"},{"location":"release-notes/9.0-beta/#security-policies-scap-security-guide","title":"Security Policies - SCAP Security Guide","text":"

The SCAP Security Guide has been updated to version 0.1.57 and made a number of changes from the counterpart we provide in EuroLinux 8:

"},{"location":"release-notes/9.0-beta/#gnome-40","title":"GNOME 40","text":"

GNOME has been updated to GNOME 40, a major step forward from EuroLinux 8's GNOME 3.32.2 , which includes many new features.

GNOME 40 includes a new and improved style, including the user interface, icons and desktop, The Activities look and feel provides a better experience when working, launching applications and arranging your personal workspace - workspaces are now arranged horizontally and the window overview and application grid are available vertically.

Many Quality of Life improvements have also been added, including:

"},{"location":"release-notes/9.0-beta/#notable-changes","title":"Notable changes","text":"

EuroLinux 9 provides refreshed and updated versions of the following packages:

We expect updated versions of these packages to be available in the GA version of RHEL.

"},{"location":"release-notes/9.0-beta/#known-issues","title":"Known issues","text":""},{"location":"release-notes/9.0-beta/#batteries-repositories","title":"Batteries repositories","text":"

The battery repository is available for customers with Golden Key and Gaia subscriptions. There are about 1000 packages that are not part of any build (so they are not included in EuroLinux Open Build roots) but are required to rebuild EuroLinux/Custom Fork from RHEL or Eurolinux sources.

"},{"location":"release-notes/9.0-beta/#eurolinux-9-for-arm","title":"EuroLinux 9 for ARM","text":"

EuroLinux for ARM will use an updated Gaia rebuild stack. We decided that this is an ideal testbed because ARM64 is not as popular as x86_64 architecture. It also allowed us to create x86_64, open build roots for i686 and x86_64 and batteries repos faster. Because creating EuroLinux 9 beta took us about four weeks, ARM should take about two weeks, after updating Gaia Stack, as we have all the necessary batteries and build orders figured out.

"},{"location":"release-notes/9.0-beta/#gaia-updates","title":"Gaia updates","text":"

New Gaia used to rebuild EuroLinux 9 for ARM64 is even more distributed.

There are new commands in Gaia:

Other notable changes:

We will also update hardware requirements for rebuild, including reference build servers for ARM and PowerPC. The rebuilds will start with the release of EuroLinux 9. It will also require updated infrastructure.

"},{"location":"release-notes/9.0-beta/#container-and-cloud-images","title":"Container and cloud images","text":"

You can use the following publicly available images for EuroLinux 9 beta

"},{"location":"release-notes/9.0-beta/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/9.0/","title":"EuroLinux 9 Release Notes","text":""},{"location":"release-notes/9.0/#technical-changes-between-eurolinux-9-and-8","title":"Technical changes between EuroLinux 9 and 8","text":""},{"location":"release-notes/9.0/#installer-and-image-creation","title":"Installer and image creation","text":"

In EuroLinux 9.0 you can now use a standalone smart card to both authenticate yourself and gain additional privileges via sudo.

For the typical cases of installing EuroLinux with a medium such as a disk interactively a Quality of Life tweak has been implemented: the Anaconda installer will now automatically activate a network connection if applicable (will try to obtain an address via DHCP).

You can now optionally permit a password-based root login via SSH or completely lock the root account in any case. (While the former is not recommended due to security and disabled in EuroLinux 9 by default, there are valid use cases which we support with this single easy switch)

"},{"location":"release-notes/9.0/#administrative-tools","title":"Administrative tools","text":"

If you want to rename a network interface, it is recommended that you use systemd link files. Check man 5 systemd.link for more information.

Alternatively udev rules may be used. If you need to use the ifcfg tool, please install the initscripts package first since it is not installed by default.

"},{"location":"release-notes/9.0/#security","title":"Security","text":"

EuroLinux 9 provides OpenSSL version 3.0.0. Among other things, the concept of providers has been added, which means that different programs can use different security algorithms depending on their needs. You can imagine a situation where you have implemented solutions where one needs to use FIPS mode, while others need to maintain compliance with less secure policies.

This new version comes with a few security-related implications. The TLS-1.3 protocol requires that a PKCS#11 token supports raw RSA or RSA-PSS signatures.

If this is applicable to your scenario, please configure your software to use TLS up to TLS-1.2. Additionally please edit the file /etc/pki/tls/openssl.cnf and add this snippet at the very end of the [ crypto_policy ] section:

SignatureAlgorithms = RSA+SHA256:RSA+SHA512:RSA+SHA384:ECDSA+SHA256:ECDSA+SHA512:ECDSA+SHA384\nMaxProtocol = TLSv1.2\n
"},{"location":"release-notes/9.0/#developer-tools","title":"Developer tools","text":"

Some of the newest and most reliable technology stacks for developers are available in the repositories. These include:

The EuroLinux 9 platform ships glibc 2.34, which will provide 10 years of business-class stability support and the same amount of software binary interface compatibility time. As a result, programs written today will work the same way 10 years from now.

"},{"location":"release-notes/9.0/#web-servers-and-database-engines","title":"Web servers and database engines","text":"

The following software is now available in our repositories:

HTTP servers:

Proxy servers:

Database engines:

"},{"location":"release-notes/9.0/#security-policies-scap-security-guide","title":"Security Policies - SCAP Security Guide","text":"

The SCAP Security Guide has been updated to version 0.1.57 and made a number of changes from the counterpart we provide in EuroLinux 8:

"},{"location":"release-notes/9.0/#gnome-40","title":"GNOME 40","text":"

GNOME has been updated to GNOME 40, a major step forward from EuroLinux 8's GNOME 3.32.2 , which includes many new features.

GNOME 40 includes a new and improved style, including the user interface, icons and desktop, The Activities look and feel provides a better experience when working, launching applications and arranging your personal workspace - workspaces are now arranged horizontally and the window overview and application grid are available vertically.

Many Quality of Life improvements have also been added, including:

"},{"location":"release-notes/9.0/#notable-changes","title":"Notable changes","text":"

EuroLinux 9 provides refreshed and updated versions of the following packages:

We expect updated versions of these packages to be available in the GA version of RHEL.

"},{"location":"release-notes/9.0/#known-issues","title":"Known issues","text":""},{"location":"release-notes/9.0/#batteries-repositories","title":"Batteries repositories","text":"

The battery repository is available for customers with Golden Key and Gaia subscriptions. There are about 1000 packages that are not part of any build (so they are not included in EuroLinux Open Build roots) but are required to rebuild EuroLinux/Custom Fork from RHEL or Eurolinux sources.

"},{"location":"release-notes/9.0/#eurolinux-9-for-arm","title":"EuroLinux 9 for ARM","text":"

EuroLinux for ARM will use an updated Gaia rebuild stack. We decided that this is an ideal testbed because ARM64 is not as popular as x86_64 architecture. It also allowed us to create x86_64, open build roots for i686 and x86_64 and batteries repos faster.

"},{"location":"release-notes/9.0/#gaia-updates","title":"Gaia updates","text":"

New Gaia used to rebuild EuroLinux 9 for ARM64 is even more distributed.

There are new commands in Gaia:

Other notable changes:

We will also update hardware requirements for rebuild, including reference build servers for ARM and PowerPC. The rebuilds will start with the release of EuroLinux 9. It will also require updated infrastructure.

"},{"location":"release-notes/9.0/#container-and-cloud-images","title":"Container and cloud images","text":"

You can use the following publicly available images for EuroLinux 9

"},{"location":"release-notes/9.0/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/9.1/","title":"EuroLinux 9.1 Release Notes","text":""},{"location":"release-notes/9.1/#major-changes-in-eurolinux-91","title":"Major changes in EuroLinux 9.1.","text":""},{"location":"release-notes/9.1/#installer-and-image-creation","title":"Installer and image creation","text":"

Image builder on-premise now supports:

Installer support customization size of the /boot partition. -allow-ssh kickstart option allows ssh login as root user.

GRUB bootloader menu is hidden by default.

"},{"location":"release-notes/9.1/#security","title":"Security","text":"

EuroLinux 9.1 introduces Keylime, a remote machine attestation tool using the trusted platform module (TPM) technology. With Keylime, you can verify and continuously monitor the integrity of remote machines.

OpenSSH now supports setting minimum RSA key length. The option to be set is named RequiredRSASize. crypto-policies enforce minimum 2048-bit RSA key length for OpenSSH by default.

NSS no longer support RSA keys shorter than 1023bit.

SELinux user-space packages have been upgraded to version 3.4. Changes: - Improved relabeling performance through parallel relabeling - Support for SHA-256 in the semodule tool - New policy utilities in the libsepol-utils package

"},{"location":"release-notes/9.1/#command-line-tools","title":"Command-line tools","text":"

The following command-line tools have been updated in EuroLinux 9.1: - cronie, now supports a randomized time within range ~ - ReaR, now utilises new variables for executing commands before and after recovery - opencryptoki to version 3.18.0 - lsvpd to version 1.7.14 - libvpd to version 2.2.9 - sysctl supports same syntax for arguments as systemd-sysctl

EuroLinux 9.1 introduces a new package xmlstarlet with which you can parse, query, validate, transform and edit XML files.

"},{"location":"release-notes/9.1/#infrastructure-services","title":"Infrastructure services","text":"

The following infrastructure services tools have been updated in EuroLinux 9.1: - chrony to version 4.2 - unbound to version 1.16.2 - frr to version 8.2.2 - whois package now provides the /usr/bin/mkpasswd binary, which can be used to encrypt a password with the crypt C library interface.

"},{"location":"release-notes/9.1/#networking","title":"Networking","text":"

NetworkManager supports migrating connection profiles from the deprecated ifcfg format to keyfile format.

The MultiPath TCP (MPTCP) code in the kernel has been updated and upstream Linux 5.19.

NetworkManager now clearly indicates that WEP support is not available in EuroLinux 9.

"},{"location":"release-notes/9.1/#programming-languages-web-and-database-servers","title":"Programming languages, web and database servers","text":"

Later versions of the following components are now available as new module streams: - PHP 8.1 - Ruby 3.1 - Node.js 18

The Apache HTTP Server has been updated to version 2.4.53.

"},{"location":"release-notes/9.1/#compilers-and-development-tools","title":"Compilers and development tools","text":""},{"location":"release-notes/9.1/#updated-system-toolchain","title":"Updated system toolchain","text":"

The following system toolchain components have been updated in EuroLinux 9.1: - binutils 2.35.2 - GCC 11.2.1 - glibc 2.34

"},{"location":"release-notes/9.1/#updated-performance-tools-and-debuggers","title":"Updated performance tools and debuggers","text":"

The following performance tools and debuggers have been updated in EuroLinux 9.1: - GDB 10.2 - Valgrind 3.19 - SystemTap 4.7 - Dyninst 12.1.0 - elfutils 0.187

"},{"location":"release-notes/9.1/#updated-performance-monitoring-tools","title":"Updated performance monitoring tools","text":"

The following performance monitoring tools have been updated in EuroLinux 9.1: - Grafana 7.5.13 - PCP 5.3.7

"},{"location":"release-notes/9.1/#updated-compiler-toolsets","title":"Updated compiler toolsets","text":"

The following compiler toolsets have been updated in EuroLinux 9.1: - GCC Toolset 12 - Go Toolset 1.18 - Rust Toolset 1.62 - LLVM Toolset 14.0.6

"},{"location":"release-notes/9.1/#java-implementations-in-eurolinx-91","title":"Java implementations in EuroLinx 9.1","text":"

EuroLinux 9 AppStream repository includes: - java-11-openjdk - OpenJDK 11 Java Runtime Environment and the OpenJDK 11 Java Software Development Kit. - java-17-openjdk - OpenJDK 17 Java Runtime Environment and the OpenJDK 17 Java Software Development Kit. - java-1.8.0-openjdk - OpenJDK 8 Java Runtime Environment and the OpenJDK 8 Java Software Development Kit. - Maven 3.8 has been added as a module stream

"},{"location":"release-notes/9.1/#batteries-repositories","title":"Batteries repositories","text":"

The battery repository is available for customers with Golden Key and Gaia subscriptions. There are about 1000 packages that are not part of any build (so they are not included in EuroLinux Open Build roots) but are required to rebuild EuroLinux/Custom Fork from RHEL or Eurolinux sources.

"},{"location":"release-notes/9.1/#eurolinux-9-for-arm","title":"EuroLinux 9 for ARM","text":"

EuroLinux for ARM will use an updated Gaia rebuild stack. We decided that this is an ideal testbed because ARM64 is not as popular as x86_64 architecture. It also allowed us to create x86_64, open build roots for i686 and x86_64 and batteries repos faster. Because creating EuroLinux 9 beta took us about four weeks, ARM should take about two weeks, after updating Gaia Stack, as we have all the necessary batteries and build orders figured out.

"},{"location":"release-notes/9.1/#gaia-updates","title":"Gaia updates","text":"

New Gaia used to rebuild EuroLinux 9 for ARM64 is even more distributed.

There are new commands in Gaia: - new automodule-update Gaia subcommand, that well - automatically updates modules. No more manual config changes for modules - new automodule-merge Gaia subcommand. This command uses multiple input files (RH/EuroLinux modules files + result build + custom files) to create an updated module definition

Other notable changes: - Striga now creates automodule-* commands - Striga can create --partial commands for module rebuild - Vardoger now supports config files that allows ignoring chosen tests/levels for selected RPMs - A lot of new configs for EuroLinux 9

We will also update hardware requirements for rebuild, including reference build servers for ARM and PowerPC. The rebuilds will start with the release of EuroLinux 9. It will also require updated infrastructure.

"},{"location":"release-notes/9.1/#container-and-cloud-images","title":"Container and cloud images","text":"

You can use the following publicly available images for EuroLinux 9 beta - EuroLinux 9 Vagrant Boxes (libvirt/VMware Workstation/VirtualBox) - EuroLinux 9 Container on the Docker Hub - EuroLinux 9 Container on the Quay.io

"},{"location":"release-notes/9.1/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/9.2/","title":"EuroLinux 9.2 Release Notes","text":""},{"location":"release-notes/9.2/#major-changes-in-eurolinux-92","title":"Major changes in EuroLinux 9.2.","text":""},{"location":"release-notes/9.2/#security","title":"Security","text":"

Key security-related highlights:

"},{"location":"release-notes/9.2/#programming-languages-web-and-database-servers","title":"Programming languages, web and database servers","text":"

Later versions of the following application are now available:

The following components have been upgraded:

"},{"location":"release-notes/9.2/#compilers-and-development-tools","title":"Compilers and development tools","text":"

The following system toolchain components have been updated in EuroLinux 9.2:

"},{"location":"release-notes/9.2/#updated-performance-tools-and-debuggers","title":"Updated performance tools and debuggers","text":"

The following performance tools and debuggers have been updated in EuroLinux 9.2:

"},{"location":"release-notes/9.2/#updated-performance-monitoring-tools","title":"Updated performance monitoring tools","text":"

The following performance monitoring tools have been updated in EuroLinux 9.2:

The following compiler toolsets have been updated in EuroLinux 9.2:

"},{"location":"release-notes/9.2/#installer-and-image-creation","title":"Installer and image creation","text":"

Key highlights for image builder:

"},{"location":"release-notes/9.2/#java-implementations-in-eurolinux-9","title":"Java implementations in EuroLinux 9","text":"

The EuroLinux 9 AppStream repository includes:

The java-11-openjdk packages, which provide the OpenJDK 11 Java Runtime Environment and the OpenJDK 11 Java Software Development Kit. The java-17-openjdk packages, which provide the OpenJDK 17 Java Runtime Environment and the OpenJDK 17 Java Software Development Kit. The java-1.8.0-openjdk packages, which provide the OpenJDK 8 Java Runtime Environment and the OpenJDK 8 Java Software Development Kit.

"},{"location":"release-notes/9.2/#containers","title":"Containers","text":"

Notable changes include:

"},{"location":"release-notes/9.2/#known-issues","title":"Known issues","text":"

Due to changes in the build process, some java packages (java-1.8.0-openjdk, java-11-openjdk, java-17-openjdk) are not updated jet (TODO).

"},{"location":"release-notes/9.2/#batteries-repositories","title":"Batteries repositories","text":"

The battery repository is available for customers with Golden Key and Gaia subscriptions. There are about 330 packages that are not part of any build (so they are not included in EuroLinux Open Build roots) but are required to rebuild EuroLinux/Custom Fork from RHEL or Eurolinux sources.

"},{"location":"release-notes/9.2/#eurolinux-9-for-arm","title":"EuroLinux 9 for ARM","text":"

EuroLinux for ARM will use an updated Gaia rebuild stack. We decided that this is an ideal testbed because ARM64 is not as popular as x86_64 architecture. It also allowed us to create x86_64, open build roots for i686 and x86_64 and batteries repos faster. Because creating EuroLinux 9 took us about four weeks, ARM should take about two weeks, after updating Gaia Stack, as we have all the necessary batteries and build orders figured out.

"},{"location":"release-notes/9.2/#gaia-updates","title":"Gaia updates","text":"

New Gaia used to rebuild EuroLinux 9 for ARM64 is even more distributed.

There are new commands in Gaia: - new automodule-update Gaia subcommand, that well - automatically updates modules. No more manual config changes for modules - new automodule-merge Gaia subcommand. This command uses multiple input files (RH/EuroLinux modules files + result build + custom files) to create an updated module definition

Other notable changes: - Striga now creates automodule-* commands - Striga can create --partial commands for module rebuild - Vardoger now supports config files that allows ignoring chosen tests/levels for selected RPMs - A lot of new configs for EuroLinux 9

We will also update hardware requirements for rebuild, including reference build servers for ARM and PowerPC. The rebuilds will start with the release of EuroLinux 9. It will also require updated infrastructure.

"},{"location":"release-notes/9.2/#container-and-cloud-images","title":"Container and cloud images","text":"

You can use the following publicly available images for EuroLinux 9 - EuroLinux 9 Vagrant Boxes (libvirt/VMware Workstation/VirtualBox) - EuroLinux 9 Container on the Docker Hub - EuroLinux 9 Container on the Quay.io

"},{"location":"release-notes/9.2/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/9.3/","title":"EuroLinux 9.3 Release Notes","text":"

This version's code name is Riga - the capital of Latvia.

"},{"location":"release-notes/9.3/#major-changes-in-eurolinux-93","title":"Major changes in EuroLinux 9.3.","text":""},{"location":"release-notes/9.3/#security","title":"Security","text":"

Key security-related highlights:

"},{"location":"release-notes/9.3/#programming-languages-web-and-database-servers","title":"Programming languages, web and database servers","text":"

Later versions of the following application are now available:

Furthermore, the Apache HTTP Server has been updated to version 2.4.57.

The following components have been upgraded:

"},{"location":"release-notes/9.3/#compilers-and-development-tools","title":"Compilers and development tools","text":"

The following system toolchain components have been updated:

"},{"location":"release-notes/9.3/#updated-performance-tools-and-debuggers","title":"Updated performance tools and debuggers","text":"

The following performance tools and debuggers have been updated:

"},{"location":"release-notes/9.3/#updated-performance-monitoring-tools","title":"Updated performance monitoring tools","text":"

The following performance monitoring tools have been updated:

"},{"location":"release-notes/9.3/#updated-compiler-toolsets","title":"Updated compiler toolsets","text":"

The following compiler toolsets have been updated in:

"},{"location":"release-notes/9.3/#java-implementations-in-eurolinux-9","title":"Java implementations in EuroLinux 9","text":"

The EuroLinux 9 AppStream repository includes:

"},{"location":"release-notes/9.3/#known-issues","title":"Known issues","text":"

Due to evolution of build process updates for Java 21 OpenJDK and SCAP Security Guide are delayed now. They are going to be delivered soon.

"},{"location":"release-notes/9.3/#batteries-repositories","title":"Batteries repositories","text":"

The battery repository is available for customers with Golden Key and Gaia subscriptions. There are about 330 packages that are not part of any build (so they are not included in EuroLinux Open Build roots) but are required to rebuild EuroLinux/Custom Fork from RHEL or Eurolinux sources.

"},{"location":"release-notes/9.3/#container-and-cloud-images","title":"Container and cloud images","text":"

You can use the following publicly available images for EuroLinux 9 - EuroLinux 9 Vagrant Boxes (libvirt/VMware Workstation/VirtualBox) - EuroLinux 9 Container on the Docker Hub - EuroLinux 9 Container on the Quay.io

"},{"location":"release-notes/9.3/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/9.4/","title":"EuroLinux 9.4 Release Notes","text":"

This version's code name is San Marino - the capital of San Marino, the world's oldest republic.

"},{"location":"release-notes/9.4/#major-changes-in-eurolinux-94","title":"Major changes in EuroLinux 9.4.","text":""},{"location":"release-notes/9.4/#security","title":"Security","text":"

Key security-related highlights:

"},{"location":"release-notes/9.4/#programming-languages-web-and-database-servers","title":"Programming languages, web and database servers","text":"

Later versions of the following application are now available:

The following components have been upgraded:

"},{"location":"release-notes/9.4/#compilers-and-development-tools","title":"Compilers and development tools","text":""},{"location":"release-notes/9.4/#updated-performance-tools-and-debuggers","title":"Updated performance tools and debuggers","text":"

The following performance tools and debuggers have been updated:

"},{"location":"release-notes/9.4/#updated-performance-monitoring-tools","title":"Updated performance monitoring tools","text":"

The following performance monitoring tools have been updated:

"},{"location":"release-notes/9.4/#updated-compiler-toolsets","title":"Updated compiler toolsets","text":"

The following compiler toolsets have been updated:

"},{"location":"release-notes/9.4/#java-implementations-in-eurolinux-9","title":"Java implementations in EuroLinux 9","text":"

The EuroLinux 9 AppStream repository includes:

"},{"location":"release-notes/9.4/#known-issues","title":"Known issues","text":"

Due to evolution of build process update for SCAP Security Guide are delayed now. They are going to be delivered soon.

"},{"location":"release-notes/9.4/#batteries-repositories","title":"Batteries repositories","text":"

The battery repository is available for customers with Golden Key and Gaia subscriptions. There are about 330 packages that are not part of any build (so they are not included in EuroLinux Open Build roots) but are required to rebuild EuroLinux/Custom Fork from RHEL or Eurolinux sources.

"},{"location":"release-notes/9.4/#container-and-cloud-images","title":"Container and cloud images","text":"

You can use the following publicly available images for EuroLinux 9:

"},{"location":"release-notes/9.4/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/ELD/","title":"EuroLinux 9 Desktop","text":"

EuroLinux Desktop is a novelty in the operating system market. It combines the look and functionality of Windows\u00ae and macOS\u00ae with the reliability and security of a server-based Enterprise Linux distribution.

"},{"location":"release-notes/ELD/#overview","title":"Overview","text":"

EuroLinux Desktop is built upon the source code of Red Hat\u00ae Enterprise Linux\u00ae 9. However, it includes a number of changes to the user interface. These primarily concern the system's appearance and usability. GNOME extensions have been used for this purpose. In EuroLinux Desktop, they are pre-configured and available immediately after installation - \"out of the box.\" In addition, the Polish language version of EuroLinux Desktop fills in the gaps in the Polish translations of the extensions and GNOME.

"},{"location":"release-notes/ELD/#appearance-features","title":"Appearance & Features","text":"

In EuroLinux Desktop, there is a translucent dock (taskbar) at the bottom of the screen. It stores icons for favorite applications, notifications and running programs, a button that displays icons for all applications in high magnification, as well as date and time information. It is possible to change the position of the bar to the right, left or top of the desktop, as well as to customize it extensively. The user can customize its height, length, transparency, color, icon spacing and size. The system allows icons to be placed on the desktop as standard, and provides a window maximization and minimization function.

EuroLinux Desktop disables the overview mode and the hotcorner function, which displays the preview mode when you hover the mouse over the top left corner of the screen. When you right-click on the wallpaper, additional menu items appear (including New Text Document). Notification icons from instant messaging or email programs have also been added. EuroLinux Desktop lets you switch day/night themes with a single click on the moon icon in the dock, and allows you to set a schedule for automatic theme switching based on the time of day.

"},{"location":"release-notes/ELD/#multimedia","title":"Multimedia","text":"

EuroLinux Desktop supports many media file formats (mp3, mpg, wma, ts, opus, ogg, mp4, flac, aiff, acc, ac3, avi), as well as the open codecs used for the popular mkv (Matroska) video files. Each of these formats can be run in the default Totem/Videos system player.

"},{"location":"release-notes/ELD/#office-suite","title":"Office Suite","text":"

EuroLinux Desktop includes the LibreOffice suite of office applications. It includes a word processor, spreadsheet, presentation editor, vector graphics editor, mathematical formula editor and relational database management system.

"},{"location":"release-notes/ELD/#software","title":"Software","text":"

EuroLinux Desktop has been integrated with the Flathub repository, providing easy access to more than 2,000 free applications. They can be downloaded from the Software application and installed with a single click. The system also supports applications in AppImage format, the use of which is similar to programs with .exe or .msi extensions. However, in the case of EuroLinux Desktop, the AppImage application is always run from a non-privileged user. The system also allows the use of applications designed for Windows\u00ae, thanks to Steam\u00ae, Lutris or Wine.

"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"EuroLinux","text":""},{"location":"#about-documentation","title":"About Documentation","text":"

This is EuroLinux community-driven documentation.

We welcome your contributions to EuroLinux!

You can:

Info

As EuroLinux is in Open Core model there are also additional documentation for our customer that are available at EuroLinux Support Portal.

Info

You can find our online Enterprise Linux Man pages server here https://man.docs.euro-linux.com.

"},{"location":"#how-documentation-is-organized","title":"How documentation is organized?","text":"

Documentation is organized in the following manner:

"},{"location":"#how-to-contribute","title":"How to contribute","text":"

We love your input! We value transparent and easy to contribute projects, that's why we choose GitHub. You can contribute to this project with:

We Use GitHub with GitHub Flow. All changes are made through pull requests.

Pull requests are the best and well-established way to propose changes. The GitHub Flow that allows us to provide reviews and discussion about documentation/code is described in detail here.

Use our specially crafted issue templates: EuroLinux Open Docs issue from a template to contribute a topic you would like to see.

If you want to contribute with code (we keep documentation as code), do the following:

  1. Fork the repository and create your own branch from master.
  2. It would be great if you could test your changes with mkdocs (described in detail in Setup environment locally)
  3. Write/Apply your changes and commit to your branch.
  4. Create a pull request!
"},{"location":"#github-labs","title":"GitHub Labs","text":"

If you are new to Git VCS (Version Control System) or GitHub, you can visit GitHub Learning Lab, especially First Day on GitHub course. GitHub courses are free, interactive and put stress on practical aspects.

"},{"location":"#tools","title":"Tools","text":"

We are using mkdocs with mkdocs-material to build and style our documentation.

"},{"location":"#setup-environment-locally","title":"Setup environment locally","text":"

Because MkDocs is Python based, you need at least these installed to run this documentation locally:

First, let's create a virtualenv, so you don't bloat your system-wide python environment:

virtualenv -p /usr/bin/python3 venv\n

Then activate virtualenv

Bash:

. venv/bin/activate\n

Fish:

. venv/bin/activate.fish\n

Now you are ready to install MkDocs and other Python packages:

pip install -r requirements.txt\n

After it serving documentation on your host is as easy as running:

mkdocs serve\n

To build documentation invoke:

mkdocs build\n

It will build documentation and save it into site directory

Please don't include site directory in pull requests

Because we deploy this documentation with GitHub Pages, the site directory is not gitignored

"},{"location":"#markdown-cheat-sheet-for-this-project","title":"Markdown cheat sheet for this project","text":"

We created simple cheat sheet for MkDocs markdown syntax with extensions enabled in this project. It can be found here.

"},{"location":"HowTo/centos8-eol-solution/","title":"CentOS 8 End of Life - solution","text":""},{"location":"HowTo/centos8-eol-solution/#introduction","title":"Introduction","text":"

This how-to provides a solution to the problem of CentOS 8 running out of support. With the end of 2021, CentOS ended its life in its stable form and started functioning as CentOS Stream, a development branch for Red Hat\u00ae Enterprise Linux\u00ae. As a result, it stopped receiving proven, stable updates and its use, especially in production environments, became risky. This is a very serious problem for many companies and individuals around the world. So there was an urgent need to find a new source of updates for CentOS in order to keep it in the infrastructure. A complete solution to this problem is support switching, that is, pointing to a new repository from which CentOS will be downloading stable updates. Such a solution is offered by EuroLinux. It is worth mentioning that both CentOS and RHEL and EuroLinux are systems built on the same source code, so they provide the same functionality. They differ mainly in branding.

The operation of switching support is simple, reasonably safe and completely reversible. What is very important, it requires neither reinstallation of the system nor the applications installed on it. The process consists of switching the repository, installing the el-release package, updating the system and reinstalling the system packages in-place. After the in-place migration, CentOS will still be usable, even in production environments.

All resources used in this tutorial can be found in the additional resources section.

"},{"location":"HowTo/centos8-eol-solution/#the-solution","title":"The solution","text":"

A project named eurolinux-migration-scripts has been created. It contains among others a script that will take care of the migration automatically. Here we describe, how to perform the switch successfully.

"},{"location":"HowTo/centos8-eol-solution/#preparations","title":"Preparations","text":"

It's vital that the system be updated to the newest release. Use the following command:

sudo yum update -y\n
"},{"location":"HowTo/centos8-eol-solution/#running-the-migration-script","title":"Running the migration script","text":"

Then download the latest production-ready release of the project containing the script. Unpack the release, visit the unpacked directory and run the script - usually this will require right-clicking in the current directory, using the 'Open in Terminal' option and running this command:

sudo bash migrate2eurolinux.sh\n

Refer to the project's README for additional commands.

"},{"location":"HowTo/centos8-eol-solution/#after-the-switch","title":"After the switch","text":"

Once the migration has finished, it's recommended to reboot your system:

sudo reboot\n

Once the system has rebooted, the migration process can be considered complete. In order to quickly verify that it was carried out successfully, we can check the distribution description:

cat /etc/el-release\n

As a result we should get a response about the distribution and latest EuroLinux version.

"},{"location":"HowTo/centos8-eol-solution/#conclusion","title":"Conclusion","text":"

As you can see, the process is quick and seamless. You can switch the repository for RHEL, Oracle Linux, AlmaLinux, and Rocky Linux the same way. In each case, the process will look almost identical.

If you have any questions or concerns, please submit them to the repository linked in the additional resources section. Thank you.

"},{"location":"HowTo/centos8-eol-solution/#additional-resources","title":"Additional resources","text":""},{"location":"HowTo/create-iso-with-repositories/","title":"How to create ISO file with EuroLinux repositories","text":"

Creating ISO that contains RPM repositories is a straightforward process. First you have to mirror repositories locally - mirroring is described in Mirror EuroLinux Locally How To.

To create an ISO file, you need mkiso command that is part of genisoimage package. You can install it with the following command:

sudo yum install -y genisoimage\n
"},{"location":"HowTo/create-iso-with-repositories/#creating-iso-with-repositories","title":"Creating ISO with repositories","text":"

In the example below, we create ISO from the repositories saved in /repos directory the output is saved to /var/eurolinux-repos.iso.

sudo mkisofs -R -J -o /var/eurolinux-repos.iso /repos/\n

This file could be:

"},{"location":"HowTo/create-iso-with-repositories/#mounting-iso-from-local-file","title":"Mounting ISO from local file","text":"

Mounting local ISO file is as simple as:

sudo mount -o loop /PATH/TO/ISO /MOUNT/PATH\n

example:

sudo mount -o loop /var/eurolinux-repos.iso /mnt/mirror\n
"},{"location":"HowTo/create-iso-with-repositories/#mounting-iso-from-virtual-cd-rom-device","title":"Mounting ISO from virtual cd-rom device","text":"

Mounting CD-ROM device is as simple as:

sudo mount /dev/DEVICE /MOUNT/PATH\n

The following example has ISO mounted as CD-ROM device /dev/sr0:

sudo mount /dev/sr0 /mnt/mirror\n
"},{"location":"HowTo/create-iso-with-repositories/#using-locally-mounted-iso-with-rpm-repositories","title":"Using locally mounted ISO with RPM repositories","text":"

To use the repositories, that the ISO file provides, create a proper .repo file that resides inside /etc/yum.repos.d/ directory.

Here is an example /etc/yum.repos.d/local-iso.repo file for EuroLinux 7 and the ISO image attached to /mnt/mirror directory.

[base]\nname = EuroLinux 7 x86_64 Base\nbaseurl=file:///mnt/mirror/eurolinux-os-7/\nenabled=1\n# Disabled gpgcheck, enable if el-release is already installed on your system\ngpgcheck=0\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7\n\n[updates]\nname = EuroLinux 7 x86_64 Updates\nbaseurl=file:///mnt/mirror/eurolinux-updates-7/\nenabled=1\n# Disabled gpgcheck, enable if el-release is already installed on your system\ngpgcheck=0\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7\n
"},{"location":"HowTo/docker/","title":"Docker","text":"

How to set up your Docker Community Edition installation.

"},{"location":"HowTo/docker/#introduction","title":"Introduction","text":""},{"location":"HowTo/docker/#use-cases","title":"Use cases","text":"

Consider the following examples:

"},{"location":"HowTo/docker/#why-use-docker-containers-over-virtual-machines","title":"Why use Docker containers over virtual machines?","text":"

In short: Docker containers utilize Linux's capabilities such as cgroups and namespaces to create an isolated environment and do not virtualize hardware. Therefore, they are way more lightweight than virtual machines and can be brought up in a large scale in a blink of an eye rather than waiting for a single virtual machine to boot.

For more information, take a look at our blog entry on the basics of containerization.

"},{"location":"HowTo/docker/#system-requirements","title":"System requirements","text":"

The following operating systems and architectures are covered by this guide:

Make sure the containers you want to run are of the same architecture as your machine.

If you need support with installation on the EuroLinux releases this guide does not cover, please create an appropriate ticket.

"},{"location":"HowTo/docker/#installation","title":"Installation","text":""},{"location":"HowTo/docker/#eurolinux-8","title":"EuroLinux 8","text":"

The following steps are based on Docker, Inc. official guide as of 2022.02.01. We will just use the commands provided as snippets for a quick way of copying & pasting one snippet for a successful installation.

The following snippet installs Docker on EuroLinux 8.6. Other releases may work as well, but have not been tested. Once a new EuroLinux release is out, this guide will be updated.

Docker installation removes podman and buildah

Please note that this operation will replace runc with containerd.io and remove both podman and buildah.

sudo yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine\nwhich yum-config-manager || sudo yum install -y yum-utils\nsudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo\nsudo yum install -y docker-ce docker-ce-cli containerd.io --allowerasing\nsudo systemctl enable docker --now\n
"},{"location":"HowTo/docker/#eurolinux-7","title":"EuroLinux 7","text":"

EuroLinux provides their own builds of Docker for EuroLinux 7.

Please prepare your EuroMan credentials and enable the el-server-7-extras-x86_64 channel first, like so:

sudo rhn-channel -u \"$el_euroman_user\" -p \"$el_euroman_password\" -c el-server-7-extras-x86_64 -a\n

Then you are ready to install Docker:

sudo yum install -y docker\nsudo systemctl enable docker --now\n
"},{"location":"HowTo/docker/#whats-next","title":"What's next?","text":"

EuroLinux provides several Docker images for you to use. They are publicly available and free of charge. Take a look at our entry EuroLinux docker images are now available for more information. Additionally, we provide a quick guide for having the images up and running in no time.

"},{"location":"HowTo/els/","title":"Migrate to EuroELS","text":"

This guide is about how to switch your repositories to the ones provided by EuroLinux Extended Life Support.

"},{"location":"HowTo/els/#introduction","title":"Introduction","text":"

Enterprise Linuxes 6 ended their life a few years ago. Still, security updates can be provided by several vendors for a fee. That's where EuroELS comes in. You can extend the lifecycle of your Enterprise Linux up to the half of 2024.

"},{"location":"HowTo/els/#how-to-migrate","title":"How to migrate","text":"

First, make sure that your system is up to date. It should be CentOS 6.10 (minor version 10).

su\nyum update -y\n

Second, in accordance with good practice, we recommend backing up your machine.

Please download the migration script available at this location:

https://github.com/EuroLinux/eurolinux-migration-scripts.git

wget https://github.com/EuroLinux/eurolinux-migration-scripts/archive/refs/heads/el6-only-switch-repos.zip\n

Please unpack the downloaded file:

unzip el6-only-switch-repos.zip\n

and navigate to the script's directory:

cd eurolinux-migration-scripts-el6-only-switch-repos\n

To start the switching process, just run the script with administrator privileges:

./migrate2eurolinux.sh\n

Once the command is executed, we'll get a recommendation to make a backup. Type YES to make the script continue.

The script will ask us about our EuroMan credentials. We provide our login and password when asked.

The repository switch has completed successfully. We can now update our Enterprise Linux 6 with the command:

yum update -y\n
"},{"location":"HowTo/ha-rs-enable-repository/","title":"How to install High Availability and Resilient Storage in EuroLinux 8","text":"

For EuroLinux 8.4, you should update the el-release package. The newer version has resilient-storage and high-availability repositories saved in the /etc/yum.repos.d/certify.repo file.

sudo yum update -y el-release\n

'certify-' prefix

Since EuroLinux 8.6 the 'certify-' prefixes in repo URLs and names are no longer used. These URLs are and will be kept as the symbolic link for backward compatibility. The certify.repo file will be used for the whole EuroLinux 8 lifecycle.

If you cannot update the release package because the new el-release package errata is not security-related, you might manually add the following to the /etc/yum.repos.d/certify.repo

[high-availability]\nname = EuroLinux High Availability\nbaseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/HighAvailability/os\nenabled=0\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8\n\n[resilient-storage]\nname = EuroLinux Resilient Storage\nbaseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/ResilientStorage/os\nenabled=0\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8\n
"},{"location":"HowTo/ha-rs-enable-repository/#enabling-repositories-permanently","title":"Enabling repositories permanently","text":""},{"location":"HowTo/ha-rs-enable-repository/#enabling-high-availability-and-resilient-storage-repository-manually","title":"Enabling High Availability and Resilient Storage repository manually","text":"

Use your favourite text editor and change enabled=0 to enabled=1 for high-availability and resilient-storage repositories.

Before edit:

[resilient-storage]\nname = EuroLinux Resilient Storage\nbaseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/ResilientStorage/os\nenabled=0\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8\n

After Edit:

[resilient-storage]\nname = EuroLinux Resilient Storage\nbaseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/ResilientStorage/os\nenabled=1\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8\n

You should do the identical changes for high-availability repositories.

"},{"location":"HowTo/ha-rs-enable-repository/#enabling-high-availability-and-resilient-storage-repository-with-yum-config-manager","title":"Enabling High Availability and Resilient Storage repository with yum-config-manager","text":"

The yum-config-manager command is part of the yum-utils package. Firstly let's install that package:

sudo yum install -y yum-utils\n

Then enable Resilient Storage and High Availability repository with the following command:

sudo yum-config-manager --enable high-availability\nsudo yum-config-manager --enable resilient-storage\n
"},{"location":"HowTo/ha-rs-enable-repository/#installing-ha-andor-resilient-storage","title":"Installing HA and/or Resilient Storage","text":"

Both High Availability and Resilient Storage have rpm groups, so installing them is trivial.

To install the High Availability add-on, invoke the following command:

sudo yum install -y @ha\n

To install the Resilient Storage add-on, invoke the following command:

sudo yum install -y @resilient-storage\n
"},{"location":"HowTo/ha-rs-enable-repository/#basic-ha-configuration","title":"Basic HA configuration","text":""},{"location":"HowTo/ha-rs-enable-repository/#configuring-firewalld","title":"Configuring firewalld","text":"

Before configuring a firewall, it's appropriate to check if firewalld is actually running. The standard systemctl is-active command is one of the options.

systemctl is-active firewalld\n

For a system that has firewalld started and enabled, you might use good enough configuration with:

sudo firewall-cmd --permanent --add-service=high-availability\nsudo firewall-cmd --reload\n
"},{"location":"HowTo/ha-rs-enable-repository/#starting-pcsd","title":"Starting pcsd","text":"

After configuring a firewall, you can start and enable pcsd (PCS GUI and remote configuration interface) with the following commands:

sudo systemctl start pcsd.service\nsudo systemctl enable pcsd.service\n

To make a very basic test of the pcsd installation, we recommend setting hacluster user password. As root user, you can, for example invoke:

# echo \"secret-pass\" | passwd hacluster --stdin\n

Then login into Pacemaker/Corosync configuration. Use the machine address on port 2224 (example: https://MACHINE_IP:2224) in your browser. The username is hacluster with password you set in previous step.

HTTPS Required

Web browser like Firefox and other programs like cURL will report \"Connection reset by peer\" or \"The connection was reset\" when connecting with cleartext HTTP.

[root@test1 pcsd]# curl localhost:2224\ncurl: (56) Recv failure: Connection reset by peer\n

From this point you can freely configure High Availability and Resilient Storage. We recommend using upstream documentation provided in Additional Links below.

"},{"location":"HowTo/ha-rs-enable-repository/#additional-links","title":"Additional links","text":""},{"location":"HowTo/install-epel-on-eurolinux/","title":"How to Install and Enable EPEL repository on EuroLinux 8","text":"

EPEL (Extra Packages for Enterprise Linux) repository is one of the most popular third-party repositories for the Enterprise Linux family. From the 4th November EuroLinux team included the original epel-release package from EPEL in the BaseOS repo. It was the most voted small quality of life change during our first community meeting. The package is re-signed with a EuroLinux GPG key, so there is no need to accept an external key to install this particular package.

The package version will be checked and updated if necessary during minor releases.

EPEL is an external repository that is community supported

As a company, we cannot provide proper care in terms of security, quality, support and lifecycle standards on a third-party repository. Nevertheless, the EPEL repository has a great history of community support.

"},{"location":"HowTo/install-epel-on-eurolinux/#installing-epel-on-eurolinux","title":"Installing EPEL on EuroLinux","text":"

Installing EPEL on EuroLinux 8 and EuroLinux 7 is as simple as:

sudo yum install -y epel-release\n

EPEL is enabled by default

The base EPEL repository is enabled by default for modular (EuroLinux 8) and non-modular packages. You can enable debuginfo and source packages in respective /etc/yum.repos.d/epel*.repo file.

From this moment, you can install and then use all EPEL goodies like htop, wine or createrepo.

"},{"location":"HowTo/migrate_to_rocky_linux/","title":"Procedure for migrating EuroLinux to RockyLinux","text":"
  1. Preparation:

    • Ensure a stable and reliable internet connection throughout the entire migration process. This is critical for downloading scripts and packages.
    • Create a full backup of the system to be migrated.
    • Test the recovery procedure to ensure you can restore the system in case of interruption or errors during migration.
    • It is recommended to run the migration in a session manager, e.g., tmux.
  2. Download migration scripts:

    • For EL8:
      curl -O https://raw.githubusercontent.com/EuroLinux/rocky-tools/feature/vaulted_migration/migrate2rocky/migrate2rocky.sh\n
    • For EL9:
      curl -O https://raw.githubusercontent.com/EuroLinux/rocky-tools/feature/vaulted_migration/migrate2rocky/migrate2rocky9.sh\n
  3. Migration:

    • Migrating EuroLinux 8 to RockyLinux 8:
      sudo bash migrate2rocky.sh -r\n
    • Migrating EuroLinux 9.4 to RockyLinux 9.4:
      • If RockyLinux has not yet released version 9.5:
        sudo bash migrate2rocky9.sh -r\n
      • If RockyLinux has already released version 9.5 or higher:
        sudo bash migrate2rocky9.sh -rv 9.4\n
"},{"location":"HowTo/mirror-eurolinux-locally/","title":"How to set up internal EuroLinux RPM mirror","text":"

This short how-to instructs how to set up your own internal EuroLinux mirror. External (publicly available) mirrors should not be set up this way.

"},{"location":"HowTo/mirror-eurolinux-locally/#system-requirements","title":"System requirements","text":""},{"location":"HowTo/mirror-eurolinux-locally/#mirroring-eurolinux-9","title":"Mirroring EuroLinux 9","text":"

Making a local mirrors for EuroLinux 8 and EuroLinux 9 is simple because:

Use Enterprise Linux 9

These instructions have been tested to work properly on Enterprise Linux 9 and Enterprise Linux 8.

First, let's create the directory where mirroring configuration will reside:

sudo mkdir -p /etc/yum-mirror-config\n

Then, let's create configuration file for EuroLinux 9 mirroring /etc/yum-mirror-config/mirror_yum_el9.conf with the contents:

[main]\ncachedir=/var/cache/yum/mirror/$basearch/$releasever\nkeepcache=0\ndebuglevel=2\nlogfile=/var/log/mirror-yum-el9.log\nplugins=1\nexactarch=0\nobsoletes=0\nreposdir=/dev/null\n\n[baseos]\nname = EuroLinux BaseOS\nbaseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/9/$basearch/BaseOS/os\nenabled=1\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux9\nskip_if_unavailable=1\n\n[appstream]\nname = EuroLinux AppStream\nbaseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/9/$basearch/AppStream/os\nenabled=1\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux9\nskip_if_unavailable=1\n\n[crb]\nname = EuroLinux CRB\nbaseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/9/$basearch/CRB/os\nenabled=1\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux9\nskip_if_unavailable=1\n

Then invoke the command reposync with the following arguments:

reposync --downloadcomps --download-metadata -c /etc/yum-mirror-config/mirror_yum_el9.conf -p /repos\n
"},{"location":"HowTo/mirror-eurolinux-locally/#mirroring-eurolinux-8","title":"Mirroring EuroLinux 8","text":"

Making a local mirror for EuroLinux 8 and EuroLinux 9 is simple because:

Use Enterprise Linux 8

These instructions have been tested to work properly on Enterprise Linux 8. While everything may work well, it's not recommended to use other versions.

First, let's create the file /etc/yum-mirror-config/mirror_yum.conf with the contents:

[main]\ncachedir=/var/cache/yum/mirror/$basearch/$releasever\nkeepcache=0\ndebuglevel=2\nlogfile=/var/log/mirror-yum.log\nplugins=1\nexactarch=0\nobsoletes=0\nreposdir=/dev/null\n\n[baseos]\nname = EuroLinux BaseOS\nbaseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/BaseOS/os\nenabled=1\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8\nskip_if_unavailable=1\n\n[appstream]\nname = EuroLinux AppStream\nbaseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/AppStream/os\nenabled=1\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8\nskip_if_unavailable=1\n\n[powertools]\nname = EuroLinux PowerTools\nbaseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/PowerTools/os\nenabled=1\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8\nskip_if_unavailable=1\n

Then invoke the command reposync with the following arguments:

reposync --downloadcomps --download-metadata -c /etc/yum-mirror-config/mirror_yum.conf -p /repos\n
"},{"location":"HowTo/mirror-eurolinux-locally/#mirroring-eurolinux-7","title":"Mirroring EuroLinux 7","text":"

Use Enterprise Linux 7

These instructions have been tested to work properly on Enterprise Linux 7. While everything may work well, it's not recommended to use other versions.

"},{"location":"HowTo/mirror-eurolinux-locally/#the-official-way","title":"The official way","text":"

EuroLinux 7 is not open-core; therefore, only organizations with a proper license (EuroMan or Golden Key) can mirror it freely.

We know

We are well aware that it is possible to mirror repos even with a single license. You can read about that below.

The official way to mirror EuroLinux repositories is the following:

Create the directory /etc/yum-mirror-config/. With the repokeys residing in that directory, create the file /etc/yum-mirror-config/mirror_yum.conf with the contents:

[main]\ncachedir=/var/cache/yum/mirror/$basearch/$releasever\nkeepcache=0\ndebuglevel=2\nlogfile=/var/log/mirror-yum.log\nexactarch=0\nobsoletes=0\ngpgcheck=0\nplugins=0\nreposdir=/dev/null\n\n[eurolinux-os-7]\nname=el7_x86_64_os\nbaseurl=https://cdn.euro-linux.com/dist/eurolinux/server/7/x86_64/os/\nsslclientkey=/etc/yum-mirror-config/repo.key\nsslclientcrt=/etc/yum-mirror-config/repo.crt\nsslcacert=/etc/yum-mirror-config/ca.crt\n\n[eurolinux-updates-7]\nname=el7_x86_64_updates\nbaseurl=https://cdn.euro-linux.com/dist/eurolinux/server/7/x86_64/updates/\nsslclientkey=/etc/yum-mirror-config/repo.key\nsslclientcrt=/etc/yum-mirror-config/repo.crt\nsslcacert=/etc/yum-mirror-config/ca.crt\n

Then invoke the command reposync with the following arguments:

reposync -d -m --download-metadata -c /etc/yum-mirror-config/mirror_yum.conf -p /repos\n

When the download finishes, the next step is to create repodata and enable groups.

cd /repos/eurolinux-os-7/; createrepo . -g comps.xml\ncd /repos/eurolinux-updates-7/; createrepo . -g comps.xml\n

Info

Enabling updateinfo (erratas information) is a little bit tricky, because firstly you have to find the newest updateinfo, unpack it, then invoke modifyrepo script. It can be automated with the script below.

REPO_DIR=/repos/eurolinux-os-7/\nunset -v LAST_UI\n# finding the newest file\nfor file in \"$REPO_DIR\"/*updateinfo.xml.gz; do\n  [[ \"$file\" -nt \"$LAST_UI\" ]] && LAST_UI=$file\ndone\n# unpacking to updateinfo.xml file\nsudo gunzip -c \"$LAST_UI\"  > \"$REPO_DIR/updateinfo.xml\"\n# Depending on the system - some has modifrepo.py script some has \"normal\" command\n/usr/share/createrepo/modifyrepo.py \"$REPO_DIR/updateinfo.xml\"  \"$REPO_DIR/repodata\" || modifyrepo \"$REPO_DIR/updateinfo.xml\"  \"$REPO_DIR/repodata\"\n\nREPO_DIR=/repos/eurolinux-updates-7/\nunset -v LAST_UI\nfor file in \"$REPO_DIR\"/*updateinfo.xml.gz; do\n  [[ $file -nt $LAST_UI ]] && LAST_UI=$file\ndone\nsudo gunzip -c \"$LAST_UI\"  > \"$REPO_DIR/updateinfo.xml\"\n# Depending on the system - some has modifrepo.py script some has \"normal\" command\n/usr/share/createrepo/modifyrepo.py \"$REPO_DIR/updateinfo.xml\"  \"$REPO_DIR/repodata\" || modifyrepo \"$REPO_DIR/updateinfo.xml\"  \"$REPO_DIR/repodata\"\n
"},{"location":"HowTo/mirror-eurolinux-locally/#the-unsupported-way","title":"The unsupported way","text":"

There is also the possibility to mirror EuroLinux repositories even with a single or even test subscription.

True Product \u2013 Real Support \u2013 Fair Price

We are faithful to our values. We also know that it's always possible to cheat and not play fair. Please be aware that during support inqury, we might check if your system is registered and supported. To this day, we always had pleasure to work with honest companies - please don't ruin that.

Mirroring other distros

The instruction allows cloning other distros, including paid ones. If you want to mirror paid Linux distribution, note that this might breach the license/license agreement.

You can mirror EuroLinux or other Enterprise Linux repositories with the following step:

Then run the following snippet as root:

reposync -d -m --download-metadata --plugins -r el-server-7-x86_64 -p /repos/\n# recreating repodata and updateinfo\nREPO_DIR=/repos/el-server-7-x86_64/\ncd /repos/el-server-7-x86_64/; createrepo . -g comps.xml\nunset -v LAST_UI\nfor file in \"$REPO_DIR\"/*updateinfo.xml.gz; do\n  [[ $file -nt $LAST_UI ]] && LAST_UI=$file\ndone\nsudo gunzip -c \"$LAST_UI\"  > \"$REPO_DIR/updateinfo.xml\"\n# Depending on the system - some has modifrepo.py script some has \"normal\" command\n/usr/share/createrepo/modifyrepo.py \"$REPO_DIR/updateinfo.xml\"  \"$REPO_DIR/repodata\" || modifyrepo \"$REPO_DIR/updateinfo.xml\"  \"$REPO_DIR/repodata\"\n
"},{"location":"HowTo/mirror-eurolinux-locally/#mirroring-eurolinux-6-els","title":"Mirroring EuroLinux 6 ELS","text":"

First, register your system to EuroLinux EuroMan with the migration scripts - use the el6-only-switch-repos branch for this.

Once the system has been registered and is receiving EL6 ELS updates, you can mirror the ELS packages with the following commands. Run them as root:

reposync -d -m --download-metadata --plugins -r els-6-x86_64 -p /repos/\n# recreating repodata and updateinfo\nREPO_DIR=/repos/els-6-x86_64/\ncd /repos/els-6-x86_64/; createrepo . -g comps.xml\nunset -v LAST_UI\nfor file in \"$REPO_DIR\"/*updateinfo.xml.gz; do\n  [[ $file -nt $LAST_UI ]] && LAST_UI=$file\ndone\nsudo gunzip -c \"$LAST_UI\"  > \"$REPO_DIR/updateinfo.xml\"\n# Depending on the system - some has modifrepo.py script some has \"normal\" command\n/usr/share/createrepo/modifyrepo.py \"$REPO_DIR/updateinfo.xml\"  \"$REPO_DIR/repodata\" || modifyrepo \"$REPO_DIR/updateinfo.xml\"  \"$REPO_DIR/repodata\"\n
"},{"location":"HowTo/vagrant-with-libvirt/","title":"Vagrant with vagrant-libvirt plugin on Enterprise Linux 8","text":""},{"location":"HowTo/vagrant-with-libvirt/#introduction","title":"Introduction","text":"

This guide covers the installation of libvirt and related tools along with the Vagrant plugin that allows using libvirt as a provider. This has been tested on a clean installation of EuroLinux 8.5 - only Vagrant has been installed already as described in Vagrant jumpstart.

"},{"location":"HowTo/vagrant-with-libvirt/#terminology","title":"Terminology","text":"

While libvirt can manage many virtualisation solutions, in the context of this document libvirt refers to: QEMU with KVM managed by libvirt.

"},{"location":"HowTo/vagrant-with-libvirt/#why-prefer-libvirt-over-providers-such-as-virtualbox","title":"Why prefer libvirt over providers such as VirtualBox?","text":"

As mentioned, KVM is a native virtualisation solution to Linux. This means a significant performance boost when compared to other providers at the slight cost of portability - if you run Linux only, then this is your solution of choice!

If you have never used libvirt before and just heard about it in this how-to, there are several goodies worth mentioning. As an example unrelated to Vagrant: Virt-Manager allows you to get a similar GUI experience out of KVM as that of e.g. VirtualBox, it is fully Free Software (no worrying about licensing shenanigans) and is more modular - in fact, there is a libvirt VirtualBox driver out there.

"},{"location":"HowTo/vagrant-with-libvirt/#install-the-plugin","title":"Install the plugin","text":"

Normally one would invoke a single command: vagrant plugin install vagrant-libvirt and the plugin would work well out-of-the-box. This is not the case for Linux distributions from the Enterprise Linux family and Upstream is aware of that, but as of today (2021.12.21) it doesn't appear to be resolved.

Because of that, you'll need to build additional components and use them with your Vagrant installation. The following procedure covers all of this and has been tested to work well with EuroLinux 8.5.

Use these commands:

[ \"$(command -v vagrant)\" ] || \\\n( read -p \"Install Vagrant first before running the following commands\" \\\n  && exit 1 )\n\nsudo dnf groupinstall \"Development Tools\" \"Virtualization Host\" -y\nsudo dnf install cmake libvirt-devel ruby-devel -y\n\nmkdir krb5\ncd krb5\nwget https://vault.cdn.euro-linux.com/sources/eurolinux/8/baseos/x86_64/Packages/k/krb5-1.18.2-8.el8.src.rpm\nrpm2cpio krb5*.src.rpm | cpio -idmv\ntar xf krb5*.tar.gz\ncd krb5*/src\n./configure\nmake\nsudo cp -P lib/crypto/libk5crypto.* /opt/vagrant/embedded/lib64/\ncd\n\nmkdir libssh\ncd libssh\nwget https://vault.cdn.euro-linux.com/sources/eurolinux/8/baseos/x86_64/Packages/l/libssh-0.9.4-3.el8.src.rpm\nrpm2cpio libssh*.src.rpm | cpio -idmv\ntar xf libssh*.tar.xz\nmkdir build\ncd build\ncmake ../libssh-*/ -DOPENSSL_ROOT_DIR=/opt/vagrant/embedded/\nmake\nsudo cp lib/libssh* /opt/vagrant/embedded/lib64\ncd\n\nvagrant plugin install vagrant-libvirt && rm -rf krb5 libssh\nsudo usermod -a -G libvirt $USER\n

Next, log out from all of your sessions (graphical and text) and log in again. From now on you should be able to run Vagrant boxes with libvirt if all requirements have been satisfied, e.g. you don't have any other providers enabled (an equivalent of deploying this guide on a clean installation).

"},{"location":"HowTo/vagrant-with-libvirt/#additional-resources","title":"Additional resources","text":""},{"location":"HowTo/virtualbox/","title":"VirtualBox","text":"

How to set up your VirtualBox installation.

"},{"location":"HowTo/virtualbox/#introduction","title":"Introduction","text":""},{"location":"HowTo/virtualbox/#use-cases","title":"Use cases","text":"

Consider the following examples:

"},{"location":"HowTo/virtualbox/#why-use-it-over-other-virtualisation-providers","title":"Why use it over other virtualisation providers?","text":"

VirtualBox is the provider with a copyleft license and a focus on interoperability when it comes to supporting different platforms. This allows you to cooperate with someone running a different operating system and when exchanging documentation - once written it's applicable to anyone that can run the software. New VirtualBox versions usually support older operating systems too. One can enjoy the new features on a system, which has recently reached its End of Life, which can be indispensable for a company that can't migrate yet.

"},{"location":"HowTo/virtualbox/#system-requirements","title":"System requirements","text":"

A brief documentation is available at Upstream's.

Your machine shall support hardware virtualisation. If it doesn't, you either need to perform additional troubleshooting - e.g. enable virtualisation in your machine's BIOS settings.

[ $(grep -cE 'vmx|svm' /proc/cpuinfo) -gt 0 ] && echo \"OK\"\n

Make sure you're running EuroLinux 8 on x86_64 architecture rather than ARM.

[ \"$(arch)\" == \"x86_64\" ] && echo \"OK\"\n
"},{"location":"HowTo/virtualbox/#installation-on-eurolinux-8","title":"Installation on EuroLinux 8","text":"

As of today (2 September 2021), 6.1 is the main VirtualBox branch and this is the one we install in this guide. Assuming your account has been made an administrator during the system installation process, simply run these commands for an installation:

sudo dnf groupinstall \"Development Tools\" -y\nsudo dnf config-manager \\\n  --add-repo=https://download.virtualbox.org/virtualbox/rpm/el/virtualbox.repo\nsudo dnf install VirtualBox-6.1 -y\n

VirtualBox should be ready to use!

"},{"location":"HowTo/virtualbox/#usb-devices","title":"USB devices","text":"

If you want VirtualBox to support USB devices for your system account, run this command as well:

sudo usermod -a -G vboxusers $USER\n

then log out of your graphical session and log in again.

"},{"location":"HowTo/virtualbox/#extension-pack","title":"Extension Pack","text":"

VirtualBox doesn't support certain technologies out-of-the-box, e.g. USB 2.0/3.0 or builtin disk encryption, among others. If you want them to be supported, you will need VirtualBox Extension Pack. Make sure you have read its license and understand its implications - you're responsible for compliance. You may want to read Upstream's FAQ for a quick start.

Once you're sure you'll be able to comply with the licensing terms, run these commands to install the Extension Pack:

export vbox_version=\"$(VBoxManage --version | cut -d'r' -f 1)\"\nwget \"https://download.virtualbox.org/virtualbox/$vbox_version/Oracle_VM_VirtualBox_Extension_Pack-$vbox_version.vbox-extpack\"\nyes | sudo VBoxManage extpack install --replace Oracle_VM_VirtualBox_Extension_Pack-$vbox_version.vbox-extpack\n
"},{"location":"HowTo/virtualbox/#troubleshooting","title":"Troubleshooting","text":""},{"location":"HowTo/virtualbox/#i-cant-enable-hardware-virtualisation-and-prefer-software-emulation","title":"I can't enable hardware virtualisation and prefer software emulation","text":"

As Upstream says, for software mode you'll need VirtualBox branch 6.0 or older.

Please also use version 6.0 if you need to run VMs with software virtualization, as this has been discontinued in 6.1.

"},{"location":"HowTo/virtualbox/#additional-resources","title":"Additional resources","text":""},{"location":"HowTo/virtualbox/#upstreams-release-pages","title":"Upstream's release pages","text":"

If you prefer a manual download, check out Upstream's Linux release pages and use the one they provide for RHEL 8.

"},{"location":"HowTo/virtualbox/#rpm-fusion","title":"RPM Fusion","text":"

Alternatively you can use RPM Fusion repository for installation. The software might differ in branding a bit and only the latest release is provided. Use these commands:

sudo dnf localinstall \\\n  https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -y\nsudo dnf localinstall --nogpgcheck \\\n  https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm -y\nsudo dnf install VirtualBox -y\nsudo akmods --kernels $(uname -r) && sudo systemctl restart vboxdrv.service\n
"},{"location":"HowTo/z-documentation-markdown/","title":"Quick markdown and extensions guide","text":"

The first part of this guide is loosely based on Adam Pritchard markdown-here cheatsheet. We include it here for contributors as reference and show how different pieces will be styled. If you are familiar with markdown, and want to skip to this project specific extensions they start with Admonition:

"},{"location":"HowTo/z-documentation-markdown/#headers","title":"Headers","text":"

Headers are created with #.

# H1 This is is reserved for page title/name\n## H2 [Contribution guide] is h2\n### H3 [Headers] is h3\n...\n###### H6\n

"},{"location":"HowTo/z-documentation-markdown/#this-is-fourth-header","title":"This is fourth header","text":""},{"location":"HowTo/z-documentation-markdown/#this-is-fifth-header","title":"This is fifth header","text":""},{"location":"HowTo/z-documentation-markdown/#this-is-sixth-header","title":"This is sixth header","text":"

Headers are essentials, because table of content is based on them.

"},{"location":"HowTo/z-documentation-markdown/#emphasis","title":"Emphasis","text":"

Emphasis, aka italics, with *asterisks* or _underscores_. \n\nStrong emphasis, aka bold, with **asterisks** or __underscores__.\n\nCombined emphasis with **asterisks and _underscores_**.\n\nStrikethrough uses two tildes. ~~Scratch this.~~\n
Emphasis, aka italics, with asterisks or underscores.

Strong emphasis, aka bold, with asterisks or underscores.

Combined emphasis with asterisks and underscores.

Strikethrough uses two tildes. ~~Scratch this.~~

"},{"location":"HowTo/z-documentation-markdown/#list","title":"List","text":"

Proper markdown required

MK-Docs has proper markdown list ordering that is 1 to 1 with markdown standard.

See: Python Markdown Issue 3

TLDR: You have indent sub-list and paragraps with 4 spaces

(In this example, leading and trailing spaces are shown with with dots: \u22c5)

1. First ordered list item\n2. Another item\n\u22c5\u22c5\u22c5\u22c5* Unordered sub-list. \n1. Actual numbers don't matter, just that it's a number\n\u22c5\u22c5\u22c5\u22c51. Ordered sub-list\n4. And another item.\n\n\u22c5\u22c5\u22c5\u22c5To create paragraph within list item you need newline and four leading spaces. To have a line\u22c5\u22c5\n\u22c5\u22c5\u22c5\u22c5break without a paragraph, you will need to use two trailing spaces.\n\n!!! info Python markdown quirk\n    Python-Markdown won't reset list without paragraph. Even if list types are\n    not compatybile (ordered vs unordered)\n\n* Unordered list can use asterisks\n- Or minuses\n+ Or pluses\n

  1. First ordered list item
  2. Another item
    • Unordered sub-list.
  3. Actual numbers don't matter, just that it's a number
    1. Ordered sub-list
  4. And another item.

    To create paragraph within list item you need newline and four leading spaces. To have a line break without a paragraph, you use two trailing spaces.

Python markdown quirk

Python-Markdown won't reset list without paragraph. Even if list types are not compatybile (ordered vs unordered)

"},{"location":"HowTo/z-documentation-markdown/#code-blocks","title":"Code blocks","text":"

To add code block use (without leading space)

 ```python\n # nice\n for i in range(69, 420):\n   print(i)\n ```\n

Example:

# nice\nfor i in range(69, 420):\n  print(i)\n

"},{"location":"HowTo/z-documentation-markdown/#admonition","title":"Admonition","text":"

Info

This is admontion extension for markdown. It support things like (info,todo), (warning,caution,attention), (danger,error) and more.

Code in markdown:

!!! info\n    This is admontion extension for markdown. It support things like\n    (info,todo), (warning,caution,attention), (danger,error) and more.\n

For more information check documentation

Check mkdocs-material docs

Code in markdown:

!!! warning \"For more information check documentation\"\n    Check [mkdocs-material docs](https://squidfunk.github.io/mkdocs-material/reference/admonitions/)\n

"},{"location":"HowTo/z-documentation-markdown/#keyboard-keys","title":"Keyboard Keys","text":"

Sometimes you might add keys combinations. For example:

To use second TY terminal use following key combination Ctrl+Alt+F2

To make them visible in nice way you should use following syntax:

To use second TY terminal use following key combination ++ctrl+alt+f2++\n

"},{"location":"jumpstarts/8-jumpstart/","title":"EuroLinux 8 Jump Start","text":"

This document contains the necessary information to set up your first EuroLinux 8 installation.

"},{"location":"jumpstarts/8-jumpstart/#system-requirements","title":"System Requirements","text":""},{"location":"jumpstarts/8-jumpstart/#x86_64-64-bit-amdintel-architecture","title":"x86_64 (64 bit AMD/Intel architecture)","text":"

Minimal and recommended requirements are following:

Resource Absolute minimal requirements for cloud deployment Minimal Recommended Logical CPU 1 1 1 RAM 768MB or 512MB with swap space 1 GB 1.5 GB per logical CPU Storage 5 GB (excluding swap) 10GB 20GB

Logical CPU means Physical CPU (including Hyper-Threading) or vCPU (virtual CPU).

Warning

It might be impossible to install EuroLinux on a system that does not meet recommended requirements.

"},{"location":"jumpstarts/8-jumpstart/#aarch64-64-bit-arm-architecture","title":"aarch64 (64 bit ARM architecture)","text":"

Minimal and recommended requirements are following:

Resource Absolute minimal requirements for cloud deployment Minimal Recommended Logical CPU 1 1 1 RAM 1 GB or 512MB with swap space 2 GB 2 GB per logical CPU Storage 5GB 10GB 20GB"},{"location":"jumpstarts/8-jumpstart/#about-absolute-minimums-for-cloud-deployment","title":"About absolute minimums for cloud deployment","text":"

During our internal testing, we were able to boot and use very basic and already installed services on Virtual Machine with only 256 MB of RAM. However, without additional memory or at least swap space available, things like updating the system will result in actions of Kernel Out of Memory (OOM) Killer.

You can try it yourself with EuroLinux Vagrant boxes and following Vagrantfile:

Vagrant.configure(\"2\") do |config|\n  config.vm.box = \"eurolinux-vagrant/eurolinux-8\"\n\n  # Explicitly disable vbguest because we are using rsync\n  if Vagrant.has_plugin?(\"vagrant-vbguest\")\n      config.vbguest.auto_update = false\n  end\n\n  config.vm.provider \"virtualbox\" do |vb|\n    vb.memory = \"256\"\n    vb.cpus = 1\n  end\n  config.vm.provider \"libvirt\" do |vb|\n    vb.memory = \"256\"\n    vb.cpus = 1\n  end\nend\n

It's also possible to install EuroLinux on less than 5 GB of space, but it also requires extra attention.

All absolute minimums for cloud deployments described above are not officially supported by EuroLinux.

"},{"location":"jumpstarts/8-jumpstart/#secure-boot","title":"Secure boot","text":"

At the moment, EuroLinux does not support secure boot. The full secure boot support is planned at the end of Q1/beginning of Q2 2022.

"},{"location":"jumpstarts/8-jumpstart/#how-to-install-eurolinux-8-from-iso","title":"How to install EuroLinux 8 from ISO","text":""},{"location":"jumpstarts/8-jumpstart/#where-can-you-obtain-iso","title":"Where can you obtain ISO?","text":"

We distribute EuroLinux in a responsible open core model. Because of that, you might download EuroLinux from different sources. The two primary sources are:

The only difference is that Customer Portal keeps older versions, when CDN, that is used for mirroring, keeps only two of the latest ISOs for each version to save space (single EuroLinux AppStream ISO might take up to 10 GB).

If you are running a huge deployment, you might consider setting up your own mirror and download ISOs from Intranet.

"},{"location":"jumpstarts/8-jumpstart/#how-to-check-iso-integrity","title":"How to check ISO integrity","text":"

During download, many things can happen - from a network or sending host failure to single-bit error. To check if ISO is undamaged, there are two mechanisms in place.

When the ISO download is completed, you can invoke the sha1sum command on the ISO file and check if checksums match.

[Alex@SpaceShipEL8 Downloads]$ sha1sum EL-8.3-x86_64-20210624-appstream.iso \n6a8abaaebe288553ec8568bd9de3f5fda5f1ddb5  EL-8.3-x86_64-20210624-appstream.iso\n

After booting up, the ISO checking process will start.

"},{"location":"jumpstarts/8-jumpstart/#installation-with-gui","title":"Installation with GUI","text":"

Because even a minimal installation uses a GUI the whole process is simple and straightforward. EuroLinux 8, as well as previous versions, uses Anaconda installer that clearly informs the user what needs to be done in order to install the system.

First, you have to choose the language that will be used during installation:

After configuring the installer language you should see a menu similar to:

"},{"location":"jumpstarts/8-jumpstart/#anaconda-installer-localization-section","title":"Anaconda installer LOCALIZATION section:","text":""},{"location":"jumpstarts/8-jumpstart/#anaconda-installer-software-section","title":"Anaconda installer SOFTWARE section:","text":""},{"location":"jumpstarts/8-jumpstart/#configuring-source-of-the-installation","title":"Configuring source of the installation","text":"

Here you might configure the source of your installation. By default, the system installs from the ISO image itself. This is one of the officially supported ways to install EuroLinux.

If you enable a NIC (Network Interface Card) in the Network installer section, you might add additional EuroLinux repositories and/or other repositories. If you add EuroLinux repositories, the installer will automatically download newer version of the packages.

'certify-' prefix

Since EuroLinux 8.6 the 'certify-' prefixes in repo URLs and names are no longer used. These names and URLs were used before we started distributing our system in the open core model. These URLs are and will be kept as the symbolic link for backward compatibility. They can be used in some older parts of the documentation.

EuroLinux 8 repositories:

For EuroLinux 8 beta:

Limited support.

Hybrid network installation from both ISO and public repositories is not our primary goal in the QA process. Packages in EuroLinux repositories are regularly updated, and it might be impossible to install a system from an external source. Depending on the state of the upstream, we might not fix a potential issue.

Below you can see an example configuration that was used to install a system:

After changing the installation source, you will have to confirm Software Selection.

"},{"location":"jumpstarts/8-jumpstart/#software-selection","title":"Software Selection","text":"

Software Selection allows you to customize which packages will be installed. You might choose from base environment groups like Server with GUI, Workstation or Minimal. You can also install additional package groups.

"},{"location":"jumpstarts/8-jumpstart/#anaconda-installer-system-section","title":"Anaconda installer SYSTEM section:","text":""},{"location":"jumpstarts/8-jumpstart/#anaconda-installer-user-settings-section","title":"Anaconda installer USER SETTINGS section:","text":"

After applying all the necessary changes, the installation can be started with the \"Begin Installation\" button.

"},{"location":"jumpstarts/8-jumpstart/#disk-partition-recommended-minimums","title":"Disk partition recommended minimums","text":"

You need at least the following partitions.

For UEFI, an EFI system partition is also required.

If your storage allows it, the following partitions are also highly recommended:

"},{"location":"jumpstarts/8-jumpstart/#installing-eurolinux-in-basic-graphic-mode","title":"Installing EuroLinux in basic graphic mode","text":"

Suppose there is a problem loading/running your graphics card driver (it might results in a black screen/error message or graphical artifacts). It's possible to install EuroLinux in basic graphics mode.

To do so, choose Troubleshooting on the welcome menu, and then Install EuroLinux 8 in basic graphics mode.

From this point the process is identical to a standard installation with GUI.

"},{"location":"jumpstarts/8-jumpstart/#installing-eurolinux-in-text-mode","title":"Installing EuroLinux in text mode","text":"

To install EuroLinux in text mode:

Before running the installation you have to provide all the necessary information (represented as ! in selection). It's a good idea to refresh the menu with R+Enter command shortly after the installer started.

After customization you are ready to start your installation.

"},{"location":"jumpstarts/8-jumpstart/#other-possibilities","title":"Other possibilities","text":"

EuroLinux can also be installed in the following manner:

Please consult upstream documentation about these topics.

"},{"location":"jumpstarts/8-jumpstart/#using-eurolinux","title":"Using EuroLinux","text":"

From this point, you can use EuroLinux as any other RHEL\u2122 based distribution.

"},{"location":"jumpstarts/8-jumpstart/#submitting-a-request-for-change","title":"Submitting a Request for Change","text":"

We truly care. If there is something that you believe could/should be changed/improved in the EuroLinux distribution and does not break compatibility with the upstream project, then drop us the issue on GitHub! All contributors are extremely welcome.

EuroLinux Distro Bugs and RFC

"},{"location":"jumpstarts/8-jumpstart/#submitting-a-bug-report","title":"Submitting a Bug report","text":"

We decided that submitting bug reports should not involve registration into some nasty miserable software. At the very same time, we know that most open-source developers have GitHub profiles. This choice makes the decision making and work as transparent as possible. That's why we decided to use it as the primary way to submit bugs.

EuroLinux Distro Bugs and RFC

This repository allows you to stay in direct contact with EuroLinux developers.

"},{"location":"jumpstarts/8-jumpstart/#other-ways-to-submit-a-bug-report","title":"Other ways to submit a bug report","text":""},{"location":"jumpstarts/8-jumpstart/#securityconfidential-bug-report","title":"Security/confidential bug report","text":"

Please use the e-mail provided above.

"},{"location":"jumpstarts/9-beta-jumpstart/","title":"EuroLinux 9 Beta Jump Start","text":"

This document contains the necessary information to set up your first EuroLinux 9 Beta installation.

"},{"location":"jumpstarts/9-beta-jumpstart/#system-requirements","title":"System Requirements","text":""},{"location":"jumpstarts/9-beta-jumpstart/#x86_64-64-bit-amdintel-architecture","title":"x86_64 (64 bit AMD/Intel architecture)","text":"

Minimal and recommended requirements are following:

Resource Absolute minimal requirements for cloud deployment Minimal Recommended Logical CPU 1 1 1 RAM 1 GiB or 768 MiB with swap space 2 GiB 1.5 GiB per logical CPU Storage 5 GB (excluding swap) 10GB 20GB

Logical CPU means Physical CPU (including Hyper-Threading) or vCPU (virtual CPU).

Warning

It might be impossible to install EuroLinux on a system that does not meet recommended requirements.

"},{"location":"jumpstarts/9-beta-jumpstart/#about-absolute-minimums-for-cloud-deployment","title":"About absolute minimums for cloud deployment","text":"

During our internal testing, we were able to boot and use very basic and already installed services on Virtual Machine with only 340 MiB of RAM. However, without additional memory or at least swap space available, things like updating the system will result in actions of Kernel Out of Memory (OOM) Killer.

You can try it yourself with EuroLinux Vagrant boxes and the following Vagrantfile:

Vagrant.configure(\"2\") do |config|\n  config.vm.box = \"eurolinux-vagrant/eurolinux-9\"\n\n  # Explicitly disable vbguest because we are using rsync\n  if Vagrant.has_plugin?(\"vagrant-vbguest\")\n      config.vbguest.auto_update = false\n  end\n\n  config.vm.provider \"virtualbox\" do |vb|\n    vb.memory = \"340\"\n    vb.cpus = 1\n  end\n  config.vm.provider \"libvirt\" do |vb|\n    vb.memory = \"340\"\n    vb.cpus = 1\n  end\nend\n

It's also possible to install EuroLinux on less than 5 GB of space, but it also requires extra attention.

All absolute minimums for cloud deployments described above are not officially supported by EuroLinux.

"},{"location":"jumpstarts/9-beta-jumpstart/#secure-boot","title":"Secure boot","text":"

Since EuroLinux 9 Beta is a pre-release version and not ready for production use, Secure Boot support has not been implemented.

"},{"location":"jumpstarts/9-beta-jumpstart/#how-to-install-eurolinux-9-beta-from-iso","title":"How to install EuroLinux 9 Beta from ISO","text":""},{"location":"jumpstarts/9-beta-jumpstart/#where-can-you-obtain-iso","title":"Where can you obtain ISO?","text":"

We distribute EuroLinux in a responsible open core model. Because of that, you might download EuroLinux from different sources. The two primary sources are:

The only difference is that Customer Portal keeps older versions, when CDN, that is used for mirroring, keeps only two of the latest ISOs for each version to save space (single EuroLinux BaseOS ISO might take up to 8 GB).

If you are running a huge deployment, you might consider setting up your own mirror and download ISOs from Intranet.

"},{"location":"jumpstarts/9-beta-jumpstart/#how-to-check-iso-integrity","title":"How to check ISO integrity","text":"

During download, many things can happen - from a network or sending host failure to single-bit error. To check if ISO is undamaged, there are two mechanisms in place.

When the ISO download is completed, you can invoke the sha1sum command on the ISO file and check if checksums match.

$ sha1sum EL-9.0-x86_64-20220225-minimal.iso\n73d39d443e27414085f7107fa21dd214d28b8730  EL-9.0-x86_64-20220225-minimal.iso\n

After booting up, the ISO checking process will start.

"},{"location":"jumpstarts/9-beta-jumpstart/#installation-with-gui","title":"Installation with GUI","text":"

Because even a minimal installation uses a GUI the whole process is simple and straightforward. EuroLinux 9, as well as previous versions, uses Anaconda installer that clearly informs the user what needs to be done in order to install the system.

First, you have to choose the language that will be used during installation: Hint: since the Anaconda installer on EuroLinux 9 activates a network connection automatically if applicable, it also determines the default language by the automatic location detection feature - in this case you can see that Polish has been automatically chosen.

Since this is a Beta release, we might need to confirm that we are aware of this fact and that this release should not be used in production.

After configuring the installer language you should see a menu similar to:

"},{"location":"jumpstarts/9-beta-jumpstart/#anaconda-installer-localization-section","title":"Anaconda installer LOCALIZATION section:","text":""},{"location":"jumpstarts/9-beta-jumpstart/#anaconda-installer-software-section","title":"Anaconda installer SOFTWARE section:","text":""},{"location":"jumpstarts/9-beta-jumpstart/#configuring-source-of-the-installation","title":"Configuring source of the installation","text":"

Here you might configure the source of your installation. By default, the system installs from the ISO image itself. This is one of the officially supported ways to install EuroLinux.

If a NIC (Network Interface Card) has been enabled in the Network & Host Name installer section, you might add additional EuroLinux repositories and/or other repositories. If you add EuroLinux repositories, the installer will automatically download newer version of the packages.

EuroLinux 9 Beta repositories:

Limited support.

Hybrid network installation from both ISO and public repositories is not our primary goal in the QA process. Packages in EuroLinux repositories are regularly updated, and it might be impossible to install a system from an external source. Depending on the state of the upstream, we might not fix a potential issue.

Below you can see an example configuration that was used to install a system - in this case the default 'Minimal' repository has been provided as the only one:

After changing the installation source, you will have to confirm Software Selection.

"},{"location":"jumpstarts/9-beta-jumpstart/#software-selection","title":"Software Selection","text":"

Software Selection allows you to customize which packages will be installed. You might choose from base environment groups like Server with GUI, Workstation or Minimal Install - since we are demonstrating with the minimal ISO image, only the last option is available. You can also install additional package groups.

"},{"location":"jumpstarts/9-beta-jumpstart/#anaconda-installer-system-section","title":"Anaconda installer SYSTEM section:","text":""},{"location":"jumpstarts/9-beta-jumpstart/#anaconda-installer-user-settings-section","title":"Anaconda installer USER SETTINGS section:","text":"

After applying all the necessary changes, the installation can be started with the \"Begin Installation\" button.

"},{"location":"jumpstarts/9-beta-jumpstart/#disk-partition-recommended-minimums","title":"Disk partition recommended minimums","text":"

You need at least the following partitions.

For UEFI, an EFI system partition is also required.

If your storage allows it, the following partitions are also highly recommended:

"},{"location":"jumpstarts/9-beta-jumpstart/#installing-eurolinux-in-basic-graphic-mode","title":"Installing EuroLinux in basic graphic mode","text":"

Suppose there is a problem loading/running your graphics card driver (it might results in a black screen/error message or graphical artifacts). It's possible to install EuroLinux in basic graphics mode.

To do so, choose Troubleshooting on the welcome menu, and then Install EuroLinux 9 in basic graphics mode.

From this point the process is identical to a standard installation with GUI.

"},{"location":"jumpstarts/9-beta-jumpstart/#installing-eurolinux-in-text-mode","title":"Installing EuroLinux in text mode","text":"

To install EuroLinux in text mode:

Since the Anaconda installer on EuroLinux 9 activates a network connection automatically if applicable, it also determines that we can start VNC or use text mode entirely. Since we are demonstrating the text mode installation, we choose the latter option.

Before running the installation you have to provide all the necessary information (represented as ! in selection). It's a good idea to refresh the menu with R+Enter command shortly after the installer started.

After customization you are ready to start your installation.

"},{"location":"jumpstarts/9-beta-jumpstart/#other-possibilities","title":"Other possibilities","text":"

EuroLinux can also be installed in the following manner:

Please consult upstream documentation about these topics.

"},{"location":"jumpstarts/9-beta-jumpstart/#using-eurolinux","title":"Using EuroLinux","text":"

From this point, you can use EuroLinux as any other RHEL\u2122 based distribution.

"},{"location":"jumpstarts/9-beta-jumpstart/#submitting-a-request-for-change","title":"Submitting a Request for Change","text":"

We truly care. If there is something that you believe could/should be changed/improved in the EuroLinux distribution and does not break compatibility with the upstream project, then drop us the issue on GitHub! All contributors are extremely welcome.

EuroLinux Distro Bugs and RFC

"},{"location":"jumpstarts/9-beta-jumpstart/#submitting-a-bug-report","title":"Submitting a Bug report","text":"

We decided that submitting bug reports should not involve registration into some nasty miserable software. At the very same time, we know that most open-source developers have GitHub profiles. This choice makes the decision making and work as transparent as possible. That's why we decided to use it as the primary way to submit bugs.

EuroLinux Distro Bugs and RFC

This repository allows you to stay in direct contact with EuroLinux developers.

"},{"location":"jumpstarts/9-beta-jumpstart/#other-ways-to-submit-a-bug-report","title":"Other ways to submit a bug report","text":""},{"location":"jumpstarts/9-beta-jumpstart/#securityconfidential-bug-report","title":"Security/confidential bug report","text":"

Please use the e-mail provided above.

"},{"location":"jumpstarts/9-jumpstart/","title":"EuroLinux 9 Jump Start","text":"

This document contains the necessary information to set up your first EuroLinux 9 installation.

"},{"location":"jumpstarts/9-jumpstart/#system-requirements","title":"System Requirements","text":""},{"location":"jumpstarts/9-jumpstart/#x86_64-64-bit-amdintel-architecture","title":"x86_64 (64 bit AMD/Intel architecture)","text":"

Minimal and recommended requirements are following:

Resource Absolute minimal requirements for cloud deployment Minimal Recommended Logical CPU 1 1 1 RAM 1 GiB or 768 MiB with swap space 2 GiB 1.5 GiB per logical CPU Storage 5 GB (excluding swap) 10GB 20GB

Logical CPU means Physical CPU (including Hyper-Threading) or vCPU (virtual CPU).

Warning

It might be impossible to install EuroLinux on a system that does not meet recommended requirements.

"},{"location":"jumpstarts/9-jumpstart/#about-absolute-minimums-for-cloud-deployment","title":"About absolute minimums for cloud deployment","text":"

During our internal testing, we were able to boot and use very basic and already installed services on Virtual Machine with only 340 MiB of RAM. However, without additional memory or at least swap space available, things like updating the system will result in actions of Kernel Out of Memory (OOM) Killer.

You can try it yourself with EuroLinux Vagrant boxes and the following Vagrantfile:

Vagrant.configure(\"2\") do |config|\n  config.vm.box = \"eurolinux-vagrant/eurolinux-9\"\n\n  # Explicitly disable vbguest because we are using rsync\n  if Vagrant.has_plugin?(\"vagrant-vbguest\")\n      config.vbguest.auto_update = false\n  end\n\n  config.vm.provider \"virtualbox\" do |vb|\n    vb.memory = \"340\"\n    vb.cpus = 1\n  end\n  config.vm.provider \"libvirt\" do |vb|\n    vb.memory = \"340\"\n    vb.cpus = 1\n  end\nend\n

It's also possible to install EuroLinux on less than 5 GB of space, but it also requires extra attention.

All absolute minimums for cloud deployments described above are not officially supported by EuroLinux.

"},{"location":"jumpstarts/9-jumpstart/#how-to-install-eurolinux-9-from-iso","title":"How to install EuroLinux 9 from ISO","text":""},{"location":"jumpstarts/9-jumpstart/#where-can-you-obtain-iso","title":"Where can you obtain ISO?","text":"

We distribute EuroLinux in a responsible open core model. Because of that, you might download EuroLinux from different sources. The two primary sources are:

The only difference is that Customer Portal keeps older versions, when CDN, that is used for mirroring, keeps only two of the latest ISOs for each version to save space (single EuroLinux BaseOS ISO might take up to 8 GB).

If you are running a huge deployment, you might consider setting up your own mirror and download ISOs from Intranet.

"},{"location":"jumpstarts/9-jumpstart/#how-to-check-iso-integrity","title":"How to check ISO integrity","text":"

During download, many things can happen - from a network or sending host failure to single-bit error. To check if ISO is undamaged, there are two mechanisms in place.

When the ISO download is completed, you can invoke the sha1sum command on the ISO file and check if checksums match.

$ sha1sum EL-9.0-x86_64-20220613-appstream.iso \nd78eebb3472ddff2dcaf110907e42ccee0367f70  EL-9.0-x86_64-20220613-appstream.iso\n

After booting up, the ISO checking process will start.

"},{"location":"jumpstarts/9-jumpstart/#installation-with-gui","title":"Installation with GUI","text":"

Because even a minimal installation uses a GUI the whole process is simple and straightforward. EuroLinux 9, as well as previous versions, uses Anaconda installer that clearly informs the user what needs to be done in order to install the system.

First, you have to choose the language that will be used during installation: Hint: since the Anaconda installer on EuroLinux 9 activates a network connection automatically if applicable, it also determines the default language by the automatic location detection feature - in this case you can see that Polish has been automatically chosen.

After configuring the installer language you should see a menu similar to:

"},{"location":"jumpstarts/9-jumpstart/#anaconda-installer-localization-section","title":"Anaconda installer LOCALIZATION section:","text":""},{"location":"jumpstarts/9-jumpstart/#anaconda-installer-software-section","title":"Anaconda installer SOFTWARE section:","text":""},{"location":"jumpstarts/9-jumpstart/#configuring-source-of-the-installation","title":"Configuring source of the installation","text":"

Here you might configure the source of your installation. By default, the system installs from the ISO image itself. This is one of the officially supported ways to install EuroLinux.

If a NIC (Network Interface Card) has been enabled in the Network & Host Name installer section, you might add additional EuroLinux repositories and/or other repositories. If you add EuroLinux repositories, the installer will automatically download newer version of the packages.

EuroLinux 9 repositories:

Limited support.

Hybrid network installation from both ISO and public repositories is not our primary goal in the QA process. Packages in EuroLinux repositories are regularly updated, and it might be impossible to install a system from an external source. Depending on the state of the upstream, we might not fix a potential issue.

Below you can see an example configuration that was used to install a system - in this case the default 'Minimal' repository has been provided as the only one:

After changing the installation source, you will have to confirm Software Selection.

"},{"location":"jumpstarts/9-jumpstart/#software-selection","title":"Software Selection","text":"

Software Selection allows you to customize which packages will be installed. You might choose from base environment groups like Server with GUI, Workstation or Minimal Install - since we are demonstrating with the minimal ISO image, only the last option is available. You can also install additional package groups.

"},{"location":"jumpstarts/9-jumpstart/#anaconda-installer-system-section","title":"Anaconda installer SYSTEM section:","text":""},{"location":"jumpstarts/9-jumpstart/#anaconda-installer-user-settings-section","title":"Anaconda installer USER SETTINGS section:","text":"

After applying all the necessary changes, the installation can be started with the \"Begin Installation\" button.

"},{"location":"jumpstarts/9-jumpstart/#disk-partition-recommended-minimums","title":"Disk partition recommended minimums","text":"

You need at least the following partitions.

For UEFI, an EFI system partition is also required.

If your storage allows it, the following partitions are also highly recommended:

"},{"location":"jumpstarts/9-jumpstart/#installing-eurolinux-in-basic-graphic-mode","title":"Installing EuroLinux in basic graphic mode","text":"

Suppose there is a problem loading/running your graphics card driver (it might results in a black screen/error message or graphical artifacts). It's possible to install EuroLinux in basic graphics mode.

To do so, choose Troubleshooting on the welcome menu, and then Install EuroLinux 9 in basic graphics mode.

From this point the process is identical to a standard installation with GUI.

"},{"location":"jumpstarts/9-jumpstart/#installing-eurolinux-in-text-mode","title":"Installing EuroLinux in text mode","text":"

To install EuroLinux in text mode:

Since the Anaconda installer on EuroLinux 9 activates a network connection automatically if applicable, it also determines that we can start VNC or use text mode entirely. Since we are demonstrating the text mode installation, we choose the latter option.

Before running the installation you have to provide all the necessary information (represented as ! in selection). It's a good idea to refresh the menu with R+Enter command shortly after the installer started.

After customization you are ready to start your installation.

"},{"location":"jumpstarts/9-jumpstart/#other-possibilities","title":"Other possibilities","text":"

EuroLinux can also be installed in the following manner:

Please consult upstream documentation about these topics.

"},{"location":"jumpstarts/9-jumpstart/#using-eurolinux","title":"Using EuroLinux","text":"

From this point, you can use EuroLinux as any other RHEL\u2122 based distribution.

"},{"location":"jumpstarts/9-jumpstart/#submitting-a-request-for-change","title":"Submitting a Request for Change","text":"

We truly care. If there is something that you believe could/should be changed/improved in the EuroLinux distribution and does not break compatibility with the upstream project, then drop us the issue on GitHub! All contributors are extremely welcome.

EuroLinux Distro Bugs and RFC

"},{"location":"jumpstarts/9-jumpstart/#submitting-a-bug-report","title":"Submitting a Bug report","text":"

We decided that submitting bug reports should not involve registration into some nasty miserable software. At the very same time, we know that most open-source developers have GitHub profiles. This choice makes the decision making and work as transparent as possible. That's why we decided to use it as the primary way to submit bugs.

EuroLinux Distro Bugs and RFC

This repository allows you to stay in direct contact with EuroLinux developers.

"},{"location":"jumpstarts/9-jumpstart/#other-ways-to-submit-a-bug-report","title":"Other ways to submit a bug report","text":""},{"location":"jumpstarts/9-jumpstart/#securityconfidential-bug-report","title":"Security/confidential bug report","text":"

Please use the e-mail provided above.

"},{"location":"jumpstarts/cloud-jump-start/","title":"Eurolinux on clouds Jump Start","text":"

This document contains the necessary information to create Your own EuroLinux instance on cloud You prefer.

"},{"location":"jumpstarts/cloud-jump-start/#amazon-web-services-aws","title":"Amazon Web Services (AWS)","text":"

AWS was launched in 2006 and has since grown to become one of the largest cloud computing platforms in the world, with millions of customers and clients ranging from startups to enterprises.

"},{"location":"jumpstarts/cloud-jump-start/#how-to-create-eurolinux-instance-on-aws","title":"How to create EuroLinux instance on AWS","text":"
  1. Check our products on AWS Marketplace and select Your favourite.
  2. Click \"Continue to Subscribe\" and then \"Continue to Configuration\"
  3. Select version, region and click \"Continue to Launch\"
  4. Configure the instance as You prefer. Remember to select or create new key pair - it's necessary to create secure connection with instance.
  5. Click \"Launch\"
  6. To get the ip of this instance, go to the EC2 console and select \"Instances\"
  7. Click on Instance ID of the newly created instance and copy ip address
  8. You can log into instance using the ssh comand with -i key-file.pem option
"},{"location":"jumpstarts/cloud-jump-start/#microsoft-azure","title":"Microsoft Azure","text":"

With its strong focus on security and compliance, Azure has become a popular choice for organizations in regulated industries such as healthcare and finance, as well as for government agencies.

"},{"location":"jumpstarts/cloud-jump-start/#how-to-create-eurolinux-instance-on-microsoft-azure","title":"How to create EuroLinux instance on Microsoft Azure","text":"
  1. On the Azure Marketplace page, click \"Get It Now\" and accept the service terms.
  2. You will be redirected to the Azure portal, where you will see a \"Create\" button after logging in.
  3. In the \"Basics\" section of the virtual machine settings menu, pay special attention to the \"Administrator account\" section, where you will choose the type of authentication and enter a username that you will use to log in to the machine.
  4. Completing the creation of a typical virtual machine requires simply filling in the required fields in the \"Basics\" section. Then move on to \"Review + create\" and click the \"Create\" button.
  5. Your virtual machine will be created along with all the resources needed for it to function properly. To connect to it, simply select it and use one of the connection options (SSH, RDP, or Bastion) offered by Azure.
"},{"location":"jumpstarts/cloud-jump-start/#google-cloud-platform-gcp","title":"Google Cloud Platform (GCP)","text":"

GCP is designed to allow developers and businesses to build, deploy, and run applications and services on Google's infrastructure.

"},{"location":"jumpstarts/cloud-jump-start/#how-to-create-eurolinux-instance-on-gcp","title":"How to create EuroLinux instance on GCP","text":"
  1. Make sure you have gcloud tool and all its components installed.
  2. Log into your GCP account via gcloud tool
  3. Choose or create a new project.
  4. Run the following command in the console:

    gcloud beta compute instances create [instance-name] --zone=[zone-name] --machine-type=[machine-type] --subnet=default --image=[image-url] --boot-disk-size=[disk-size]\n

    Where: * [instance-name] is the desired name for the virtual machine. * [zone-name] is the zone where the virtual machine will be created. * [machine-type] is the type of machine to be created. * [image-url] is the URL of the image. * [disk-size] is the size of the boot disk.

    For example to create EuroLinux 8.6 instance in a us-central1-a region, type:

    gcloud beta compute instances create eurolinux-server1 --zone=us-central1-a --machine-type=n1-standard-1 --subnet=default --image=https://www.googleapis.com/compute/v1/projects/eurolinux-cloud/global/images/eurolinux-8-6 --boot-disk-size=10GB\n

"},{"location":"jumpstarts/cloud-jump-start/#alibaba-cloud","title":"Alibaba Cloud","text":"

Alibaba Cloud, also known as Aliyun aims to provide reliable and secure cloud computing solutions for businesses and organizations around the world, with a focus on serving the Asia-Pacific market.

"},{"location":"jumpstarts/cloud-jump-start/#how-to-create-eurolinux-instance-on-alibaba-cloud","title":"How to create EuroLinux instance on Alibaba Cloud","text":"
  1. Go to Alibaba Cloud Marketplace and select your favorite EuroLinux operating system image.
  2. Review the product description and then click the \"Choose Your Plan\" button. You will now be redirected to the Aliyun console page where you will continue creating the instance.
  3. Configure the instance to meet your needs. At this point, you can also change the payment type to subscription.
  4. In the System Configurations tab, select or create a \"Key Pair\" that will allow you to access the machine.
  5. Finally, accept the terms and create the instance by clicking \"Create Instance\". After a few minutes, your instance should be ready to use.
"},{"location":"jumpstarts/cloud-jump-start/#openstack","title":"OpenStack","text":"

OpenStack provides a flexible and customizable platform that can be used for a variety of cloud computing needs, from web hosting to big data processing to scientific computing.

Important: It is a cloud-generic images.

"},{"location":"jumpstarts/cloud-jump-start/#how-to-create-eurolinux-instance-on-openstack","title":"How to create EuroLinux instance on OpenStack","text":"
  1. Download Your favourite EuroLinux image in qcow2 or raw format. For example: https://fbi.cdn.euro-linux.com/images/EL-9-cloudgeneric-2023-03-19.qcow2
  2. Login to the OpenStack dashboard.
  3. Click on the \"Create Image\" button in \"Compute\" -> \"Images\" section.
  4. Fill in the required information and upload this image to OpenStack.
  5. To Launch Your instance with image You have just created simply click \"Launch Instance\" in \"Compute\" -> \"Instances\" section and fill the required informations.
  6. Make sure You create Your own key-pair and attach it to this instance.
  7. To log into Your EuroLinux instance copy the IP address and using the ssh comand with -i key-file.pem option, login as root to newly created machine.

Important: EuroLinux 9 have the root login without-password enabled by default, which means You have to assign the key-pair to Your instance to login.

"},{"location":"jumpstarts/container-jumpstart/","title":"EuroLinux Containers JumpStart","text":""},{"location":"jumpstarts/container-jumpstart/#basics","title":"Basics","text":"

Using EuroLinux container images is easy. We provide multiple containers and their versions. The most important are base images for EuroLinux 7 (with FBI [Free Base Image] repository) and EuroLinux 8 (with complete repositories - EuroLinux 8 is freely available). All EuroLinux container images are OCI standard container images. You can download them from two primary sources:

EuroLinux images can be run with any OCI standardized container runtimes such as runC (Docker/Moby project) or crun (Podman/Buildah/CRI-O).

To download the image:

Docker Hub:

docker pull eurolinux/eurolinux-8\n

Quay.IO:

podman pull quay.io/eurolinux/eurolinux-8\n

To run a container that will be removed after process exit. You might use:

docker run -rm -ti eurolinux/eurolinux-8\n

Inside the container, you can check the system version

bash-4.4# cat /etc/el-release\nEuroLinux release 8.5 (Tirana)\n

To detach the container from the console, add -d flag to docker/podman run command.

docker run -rm -ti -d --name eurolinux eurolinux/eurolinux-8\n
then run:
docker exec -it eurolinux bash\n
to enter the console of a container.

"},{"location":"jumpstarts/container-jumpstart/#other-containers","title":"Other containers","text":"

As a company, we create and support multiple containers, including other Enterprise Linux distributions. For example, we provide:

Other containers that we build are:

You can visit our organization page on the Docker Hub to find all containers that we officially support.

"},{"location":"jumpstarts/container-jumpstart/#older-versions","title":"Older Versions","text":"

If you want to use the previous version of the EuroLinux container, you must find the desired tag. Example for EuroLinux 8:

"},{"location":"jumpstarts/container-jumpstart/#request-for-changecomment-and-bug-report-repository","title":"Request for Change/Comment and Bug report repository","text":"

You can request a change, leave a comment or report a bug in this EuroLinux containers RFC repository.

"},{"location":"jumpstarts/rpi/","title":"EuroLinux for Raspberry Pi Jump Start","text":""},{"location":"jumpstarts/rpi/#about-images","title":"About images","text":"

EuroLinux Raspberry images are made for Raspberry Pi 4 model B. The system is EuroLinux 9. The minimal images could work with older Raspberry Pi 3. But we won't support it even with 'best effort' as Raspberry Pi 3 does not meet the minimum hardware requirements for Enterprise Linux 9 or Enterprise Linux 8.

The basic credentials are the following:

SSH Root login disabled

SSH root login is disabled by default on EuroLinux 9.

Raspberry only

The Raspberry Pi images also won't work with other ARM-64 computers as RPI images are specially tailored for this particular hardware.

"},{"location":"jumpstarts/rpi/#downloading-and-checking-the-images","title":"Downloading and checking the images","text":"

Firstly choose the image from https://fbi.cdn.euro-linux.com/images. The Raspberry Pi images have the rpi-TYPE(where TYPE can be minimal or gnome) in their names. You can download the image with wget, curl or with your browser.

It's advised to check the image integrity by comparing checksums. The SHA256 checksums can be found at https://fbi.cdn.euro-linux.com/images/sha256sum.txt

Example download and checksum comparison:

wget https://fbi.cdn.euro-linux.com/images/EuroLinux-9-rpi-minimal-2023-01-02-sda.raw.xz\nsha256sum EuroLinux-9-rpi-minimal-2023-01-02-sda.raw.xz\ncurl -s https://fbi.cdn.euro-linux.com/images/sha256sum.txt | grep EuroLinux-9-rpi-minimal-2023-01-02-sda.raw.xz\n

"},{"location":"jumpstarts/rpi/#flashing-the-microsd-card","title":"Flashing the MicroSD card","text":"

With the image downloaded now, it's time to flash your MicroSD card. There are multiple options, you can use:

We recommend Balena Etcher as dd might destroy the system partition or other important data if used without proper experience.

"},{"location":"jumpstarts/rpi/#balena-etcher","title":"Balena Etcher","text":"

Balena Etcher is one of the most popular and easy-to-use programs that allow flashing the SD cards for Raspberry Pi. It can also create other bootable media like USB sticks and more. Firstly download the AppImage from the official Balena Etcher website - https://www.balena.io/etcher/ (Download for Linux x64).

Most file managers will run AppImage when chosen and clicked. To run it from the command line firstly change the permissions then run.

chmod 755 balenaEtcher-1.13.1-x64.AppImage\n./balenaEtcher-1.13.1-x64.AppImage\n

The process itself is straightforward. There is plenty of documentation/videos about the Balena Etcher, so we trust that in case of any troubles you will be able to find a solution on your own.

"},{"location":"jumpstarts/rpi/#dd","title":"dd","text":"

dd is a program that is older than Linux Kernel itself :). It is one of these little tool that makes Linux/Unix powerful. It can be used to flash the memory card by writing output to the memory card device.

Firstly insert the memory card into the slot. Then check with the dmesg device file that is corresponding.

The dmesg will inform about partition:

[ TIME] scsi 0:0:0:0: Direct-Access     Generic  Mass-Storage     1.11 PQ: 0 ANSI: 2\n[ TIME] scsi 0:0:0:0: Attached scsi generic sg0 type 0\n[ TIME] sd 0:0:0:0: [sdX] 250347520 512-byte logical blocks: (128 GB/119 GiB)\n[ TIME] sd 0:0:0:0: [sdX] Write Protect is off\n[ TIME] sd 0:0:0:0: [sdX] Mode Sense: 03 00 00 00\n[ TIME] sd 0:0:0:0: [sdX] No Caching mode page found\n[ TIME] sd 0:0:0:0: [sdX] Assuming drive cache: write through\n

Where sdX is your SD card. To write you first need to decompress the image with the xzcat command and then pipe output to the dd (writing to the device requires root privileges, that's why there is sudo).

xzcat /path/to/image/image.raw.xz | sudo dd status=progress oflag=sync bs=4k of=/dev/sdX\n

For example:

xzcat ~/Downloads/EuroLinux-9-rpi-minimal-2023-01-02-sda.raw.xz | sudo dd status=progress oflag=sync bs=4k of=/dev/sda\n

"},{"location":"jumpstarts/rpi/#booting-from-usb","title":"Booting from USB.","text":"

EuroLinux 9.1 can be natively booted from USB on Raspberry Pi 4. You should flash your USB stick/disk in the same manner that you flash a micro SD card.

Early-produced RPI 4 might require firmware update.

Early-produced Raspberry Pi 4 might require a firmware update before booting the system from the USB.

"},{"location":"jumpstarts/rpi/#wifi-setup","title":"Wifi setup","text":"

Wifi adapter works out-of-box. It's trivial to configure it from a desktop (Gnome). To configure the WIFI from the console you can use the following commands.

Firstly find the SSID (WIFI name) that you want to use:

nmcli d wifi list\n

Then you can provide a password on the command line (note password will be saved in bash command history)

nmcli d wifi connect WIFI_NAME password PASSWORD\n

or if You want to be prompted for the password

nmcli d wifi connect WIFI_NAME --ask\n

Note that your RPI will automatically connect to the WIFI after reboot.

"},{"location":"jumpstarts/rpi/#disable-the-powersave-mode-on-the-raspberry-pi-wifi-card","title":"Disable the powersave mode on the Raspberry Pi WIFI card","text":"

The Raspberry Pi WIFI card by default enters powersave mode when there is not much going on. Some users reported a problem with broken SSH sessions and other closed connections due to this feature. To disable power save mode use the following command

iw wlan0 set power_save off\n

The problem with this solution is that this state won't survive system reboot. To fix that issue during startup you can add a network manager dispatcher script that will disable power_save on boot. Put the following script:

#!/usr/bin/env bash\n\ninterface=$1\nevent=$2\n\nif [[ $interface != \"wlan0\" ]] || [[ $event != \"up\" ]]\nthen\n  return 0\nfi\niw wlan0 set power_save off\n

into the /etc/NetworkManager/dispatcher.d/iw-wlan0-disable-powersave.sh, then add the execution permission

chmod +x /etc/NetworkManager/dispatcher.d/iw-wlan0-disable-powersave.sh\n
"},{"location":"jumpstarts/rpi/#enabling-the-i2c-i2c-inter-integrated-circuit","title":"Enabling the I2C (I\u00b2C - Inter-Integrated Circuit)","text":"

To enable i2c you have to add the i2c_arm with flag on as dtparam to the /boot/config.txt

dtparam=i2c_arm=on\n

The following script can be used:

echo 'dtparam=i2c_arm=on'  | sudo tee -a /boot/config.txt\n

We also recommend installing i2c-tools.

sudo dnf install -y i2c-tools\n

After this changes, you have to reboot the system to start i2c.

"},{"location":"jumpstarts/rpi/#enabling-spi-serial-peripheral-interface","title":"Enabling SPI (Serial Peripheral Interface).","text":"

To enable SPI you have to add spi with flag on as dtparam to the /boot/config.txt

dtparam=spi=on\n
The following script can be used:
echo 'dtparam=spi=on'  | sudo tee -a /boot/config.txt\n
After this changes you have to reboot the system to start SPI.

"},{"location":"jumpstarts/rpi/#feedback","title":"Feedback","text":"

If You want to leave feedback/request for change/bug report on EuroLinux Raspberry Pi images please use the https://github.com/EuroLinux/raspberry-pi-build repository.

If believe that something important from the documentation is missing don't hesitate to create issue in this documentation repository.

"},{"location":"jumpstarts/vagrant-jumpstart/","title":"Vagrant Jumpstart","text":""},{"location":"jumpstarts/vagrant-jumpstart/#introduction","title":"Introduction","text":"

Ever wanted to create a development environment that is guaranteed to work flawlessly on several developers' workstations without the It works on my machine! excuses? Well, now you can! Just get Vagrant, write your specification and share it with coworkers!

"},{"location":"jumpstarts/vagrant-jumpstart/#requirements","title":"Requirements","text":"

Vagrant will be managing the virtual machines of the backend provider of your choice. If you find out it's not listed, consider checking if there's a plugin-based implementation. Make sure you have a supported provider installed - we'll be using VirtualBox in this guide. You can use our VirtualBox installation guide as a reference.

"},{"location":"jumpstarts/vagrant-jumpstart/#installation-on-eurolinux-8","title":"Installation on EuroLinux 8","text":"

Simply run these commands and you're ready to go:

sudo dnf config-manager \\\n  --add-repo=https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo\nsudo dnf install vagrant -y\n
"},{"location":"jumpstarts/vagrant-jumpstart/#eurolinux-boxes","title":"EuroLinux Boxes","text":"

A box is a format that defines: an image of an operating system with preinstalled software, a provider for that image and its version - it's a ready-made appliance for that provider to run. This appliance works the same across people's workstations, which most likely will have differences in configuration and potentially different providers or even operating systems. That is as long as they use a provider, which the box is built for.

EuroLinux Vagrant boxes are available at: https://app.vagrantup.com/eurolinux-vagrant Let's use the box eurolinux-vagrant/eurolinux-8 as an example.

"},{"location":"jumpstarts/vagrant-jumpstart/#box-details","title":"Box details","text":"

See the details of the box - multiple providers, that the box has been built for, are listed along with the box versions and build dates. When writing your specification, you'll be able to choose from them as you wish.

"},{"location":"jumpstarts/vagrant-jumpstart/#run-the-box","title":"Run the box","text":"

Here's a basic procedure for running a Vagrant environment (a virtual machine, which uses our box) in a separate directory:

mkdir el8-vagrant\ncd el8-vagrant/\nvagrant init eurolinux-vagrant/eurolinux-8\nvagrant up\nvagrant ssh\n

You should now be connected to the machine and able to perform your desired operations inside it. Go ahead, play around, install your favourite developer tools, build an awesome, advanced, multi-component application and be sure everyone's able to deploy it on their workstations without any hassle!

"},{"location":"jumpstarts/vagrant-jumpstart/#what-about-the-specification-mentioned-earlier-vagrantfile","title":"What about the specification mentioned earlier? - Vagrantfile","text":"

Once you've ran the commands above, you'll have a Vagrantfile in the el8-vagrant directory. Take a look, what's inside. You'll be greeted with an introduction, references and lots of common options along with comments explaining them:

  # The most common configuration options are documented and commented below.\n  # For a complete reference, please see the online documentation at\n  # https://docs.vagrantup.com.\n

As you've already ran the box as explained in the previous section, you can see that there's no necessity to tweak anything inside Vagrantfile. The parameters that you can tweak, e.g. the virtual machine's memory or the amount of CPUs you should adapt to your work - e.g. if you need additional resources for developing/running your application, go ahead and increase them. Once that's done, check out if they can be reduced once you know your software resource requirements.

Depending on the task you want to achieve, whether it be a ready-made appliance or a base virtual system that gets provisioned with your application and its dependencies or something else, that's when changes to the specification must be made - e.g. the additional provisioning procedure shall be written.

As the comment quoted above says, refer to the comments the Vagrantfile provided for common options explanation. Once you know their purpose, try them out! Get comfortable with them and read Upstream's documentation for additional info, tips and more advanced, cool possibilities - such as a multi-machine infrastructure defined in a single Vagrantfile.

"},{"location":"jumpstarts/vagrant-jumpstart/#additional-resources","title":"Additional resources","text":""},{"location":"jumpstarts/wsl/","title":"EuroLinux on WSL Jumpstart","text":"

This guide provides a quick overview of setting up EuroLinux on Windows Subsystem for Linux (WSL).

"},{"location":"jumpstarts/wsl/#prerequisites","title":"Prerequisites:","text":""},{"location":"jumpstarts/wsl/#enabling-wsl","title":"Enabling WSL","text":"

Follow the official Microsoft documentation to enable WSL: https://learn.microsoft.com/en-us/windows/wsl/

"},{"location":"jumpstarts/wsl/#about-eurolinux-on-wsl","title":"About EuroLinux on WSL","text":"

EuroLinux company provides EuroLinux version 9 for WSL. The system is based on Red Hat Enterprise Linux 9 and is compatible with it. We used our base container image. The official repository is located https://github.com/EuroLinux/wsl it also contains the build scripts and latest documentation/releases.

"},{"location":"jumpstarts/wsl/#import-and-install-eurolinux-for-wsl","title":"Import and install EuroLinux for WSL","text":""},{"location":"jumpstarts/wsl/#feedback","title":"Feedback","text":"

To provide feedback, request changes, or report bugs, please visit our official RFC/Bug repository at https://github.com/EuroLinux/eurolinux-distro-bugs-and-rfc. Your input is highly appreciated!

"},{"location":"knowledge-base/el6-jdk-install-failure/","title":"Unable to install java-1.7.0-openjdk on EuroLinux 6","text":""},{"location":"knowledge-base/el6-jdk-install-failure/#scenario","title":"Scenario","text":"

An attempt to install the latest version of java-1.7.0-openjdk.x86_64 as part of the EuroELS subscription fails with a message like:

Error in PRETRANS scriptlet in rpm package 1:java-1.7.0-openjdk-1.7.0.261-2.6.22.1.el6_10.x86_64\nerror: lua script failed: /usr/libexec/copy_jdk_configs.lua:272: attempt to index global 'file' (a nil value)\n
"},{"location":"knowledge-base/el6-jdk-install-failure/#solution","title":"Solution","text":"

The package java-1.7.0-openjdk.x86_64 expects that the directory /var/lib/rpm-state/ exists. Still, this might not be the case on every installation.

Please create this directory manually:

# mkdir /var/lib/rpm-state/\n
"},{"location":"knowledge-base/eurolinux-6-vault/","title":"Accessing EuroLinux 6.10 Vaulted Repositories","text":""},{"location":"knowledge-base/eurolinux-6-vault/#eurolinux-6-els-eol-2024-06-30","title":"EuroLinux 6 ELS EOL 2024-06-30","text":"

EuroLinux 6 reached its end of life on 2020-11-30; EuroLinux 6 ELS reached EOL on 2024-06-30 and is no longer supported. This means critical security updated are no longer provided, making your system highly vulnerable to security threats.

Upgrading might not always be possible due to reasons like replicating a specific production environment in development, supporting legacy systems, or strict software compatibility requirements. In such cases, while accessing the vaulted repositories is an option, be aware of the inherent security risks.

"},{"location":"knowledge-base/eurolinux-6-vault/#eurolinux-6-vault","title":"EuroLinux 6 vault","text":"

Using the following gist is a straightforward way to access the EuroLinux 6 vault:

Or manually add the following to /etc/yum.repos.d/eurolinux-6-vault-repos.repo:

[eurolinux6-base]\nname=Eurolinux 6 Base Vault\nbaseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/6/6.10/BaseOS/x86_64/os/\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux\n\n[eurolinux6-extras]\nname=Eurolinux 6 Updates Vault\nbaseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/6/6.10/Extras/x86_64/os/\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux\n

If the GPG key is not present on your system, you can add it with the following command:

curl -o /etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux https://fbi.cdn.euro-linux.com/security/RPM-GPG-KEY-eurolinux\n
"},{"location":"knowledge-base/eurolinux-6-vault/#removing-subscription-packages","title":"Removing subscription packages","text":"

Previously, due to EuroLinux 6 repositories being paywalled, a subscription was required. This involved tools like rhn_register or el_register alongside the EuroMan service or a local mirror. With EuroMan's sunsetting alongside EuroLinux 6 ELS EOL, these subscription-related packages are no longer necessary (unless using custom Spacewalk/EuroMan Forman/EuroMan). You can safely remove them using the following command:

sudo yum remove -y rhn* subscription*\n
"},{"location":"knowledge-base/eurolinux-7-vault/","title":"Using EuroLinux 7 from vaulted repositories","text":""},{"location":"knowledge-base/eurolinux-7-vault/#eurolinux-7-eol-2024-06-30","title":"EuroLinux 7 EOL 2024-06-30","text":"

EuroLinux 7 reached its end of life on 2024-06-30. It means no further updates, including security updates, will be available. We strongly recommend upgrading to EuroLinux 8 or later as soon as possible. However, you may still need to use the older version for development, legacy, and compatibility reasons.

"},{"location":"knowledge-base/eurolinux-7-vault/#eurolinux-7-vault","title":"EuroLinux 7 vault","text":"

Using the following gist is a straightforward way to access the EuroLinux 7 vault:

Or manually add the following to /etc/yum.repos.d/eurolinux-7-vault-repos.repo:

[eurolinux7-base]\nname=Eurolinux 7 Base Vault\nbaseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/7/7.9/os/\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7\n\n[eurolinux7-updates]\nname=Eurolinux 7 Updates Vault\nbaseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/7/7.9/updates/\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7\n

The GPG key should be available in the system, but if it is not, you can add it with the following:

curl -o /etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7 https://fbi.cdn.euro-linux.com/security/RPM-GPG-KEY-eurolinux7\n
"},{"location":"knowledge-base/eurolinux-7-vault/#eurolinux-78-and-77","title":"EuroLinux 7.8 and 7.7","text":"

As a bonus, you could also use even older versions of EuroLinux 7.8 and 7.7, which contain only updates up to the last minor release of the given version. Sample content of the .repo files are below:

For EuroLinux 7.8:

[eurolinux7-base]\nname=Eurolinux 7.8 Base Vault\nbaseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/7/7.8/os/\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7\n\n[eurolinux7-updates]\nname=Eurolinux 7.8 Updates Vault\nbaseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/7/7.8/updates/\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7\n

For EuroLinux 7.7:

[eurolinux7-base]\nname=Eurolinux 7.8 Base Vault\nbaseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/7/7.7/os/\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7\n\n[eurolinux7-updates]\nname=Eurolinux 7.8 Updates Vault\nbaseurl=https://vault.cdn.euro-linux.com/legacy/eurolinux/7/7.7/updates/\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7\n

"},{"location":"knowledge-base/eurolinux-7-vault/#removing-subscription-packages","title":"Removing subscription packages","text":"

Since the EuroLinux 7 repositories were behind the paywall, you used to need the subscription that used rhn_register or el_register commands and ancient EuroMan service or local mirror of the system. EuroMan was sunsetted with EuroLinux 7 EOL.

You can confidently remove the subscription-related packages (as long as you are not using custom Spacewalk/EuroMan Forman/EuroMan) with the following command:

sudo yum remove -y rhn* subscription*\n
"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/","title":"Black Screen After update to EuroLinux 8.10 - EFI problem","text":""},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#background","title":"Background","text":"

We are deeply sorry to inform you that one of the packages in EuroLinux 8.10 created a severe mistake in the boot configuration. The package grub2-efi-x64 was copied from a never-released beta repository, and it was not supposed to be there in that version.

If you updated your system:

The following error might appear after booting your system.

error: file `/EFI/eurolinux/grubx64.efi` Not Found.\n

and other similar errors, like:

StartImage failed\n

Generally speaking, the system won't boot into the bootloader (GRUB). Depending on your UEFI software, you might see different error messages.

Depending on your UEFI software you might be able to boot system normally. If you can boot system you can fix the problem by reinstalling the grub2-efi-x64 package.

"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#when-this-problem-does-not-occur","title":"When this problem does not occur","text":""},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#update-after-may-28th-12-cet","title":"Update after May 28th, 12 CET","text":"

If you are updating your system with a repository synced after May 28, 13 CET, you should not have this problem. The package was removed and overwritten from the repository, and the proper package was added.

"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#updated-but-not-rebooted-system","title":"Updated but not rebooted system","text":"

If you updated but have not rebooted the system -> please reinstall the grub2-efi-x64 package and kernel packages:

sudo yum clean all\nsudo yum reinstall -y `kernel*` `grub2*`\n
"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#iso-files","title":"ISO files","text":"

The ISO files were updated, and the previous ISO was removed. The new ISO is supposed to be released today (May 28th).

"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#revert-from-backupsnapshot","title":"Revert from backup/snapshot","text":"

If you can, please revert from the backup or snapshot to version 8.9. The update process now contains overwritten, updated and proper packages, and this problem will not occur.

"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#rescue-system-with-wrong-efi-from-a-live-cd","title":"Rescue system with wrong EFI from a live CD.","text":"
  1. Download LiveISO CD
  2. Change boot order (if necessary)
  3. Mount ISO/Create ISO on the pendrive
  4. Start system from ISO
  5. Mount the EFI partition
  6. Copy the EFI files
  7. Run system normally
  8. Reinstall kernel-core and grub2-efi-x86
"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#download-liveiso-cd","title":"Download LiveISO CD","text":"

One of the smallest ISO and well-known projects is Rescatux. You can download it from: https://sourceforge.net/projects/rescatux/files/rescatux-0.74/rescatux-0.74.iso/download

You can use different ISOs, such as our Desktop Live or Ubuntu.

"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#change-the-boot-order-if-necessary","title":"Change the boot order (if necessary)","text":"

Changing the boot order might be necessary for both VM and Physical Machines.

"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#mount-isocreate-iso-on-pendrive","title":"Mount ISO/Create ISO on pendrive","text":"

Mount rescue ISO to a VM. For physical machines, create a bootable pendrive with the ISO. The process is similar to creating a bootable pendrive for installation.

After mounting or inserting the pen drive, start the rescue/live CD system.

"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#starting-rescuetux-or-other-livecd","title":"Starting rescuetux or other livecd","text":"

You can safely start Rescuetux or another live CD. The process is similar to getting a standard desktop. You can safely skip any questions and programs and get straight to the terminal.

"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#find-and-mount-the-efi-partition","title":"Find and mount the EFI partition","text":"

Finding an EFI partition is quite straightforward use one of the following commands:

sudo lsblk\n

Example efi partition output

/dev/nvme0n1p5: UUID=\"2A1E-AC26\" TYPE=\"vfat\" PARTLABEL=\"EFI System Partition\" PARTUUID=\"6b15bd77-bb2e-4393-9fbb-445625660679\"\n

or

lsblk -f\n
Example EFI partition output

vda1 vfat               776-93D0\n

After finding the EFI partition, mount it to a temporary location. In the example bellow, we are using /mnt as a temporary location, and partition is the /dev/vda1

sudo mount /dev/vda1 /mnt\n

Confirm the EFI partition is mounted correctly and contains EFI directory

cd /mnt/\nls\n

The output should contains at least an EFI directory

EFI\n
"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#copy-the-efi-files","title":"Copy the EFI files","text":"
sudo cp -r /mnt/EFI/redhat/* /mnt/EFI/eurolinux/.\n
"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#reboot-system","title":"Reboot system","text":"

Depending on the live CD/ISO you used, you might need to reboot the system or exit the live CD.

sudo reboot\n
in most cases, is enough. You can also shut down the system with shutdown -h now.

Before starting the EuroLinux system, remember to remove the rescue/LiveCD ISO ISO or pendrive.

The whole process is as simple as the one on the screenshot:

"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#running-the-system-and-reinstalling-the-packages","title":"Running the system and reinstalling the packages","text":"

After rebooting the system you should be able to boot into the system in normall state. You can now reinstal the kernel and grub packages.

sudo yum clean all\nsudo yum reinstall -y `kernel*` `grub2*`\n

"},{"location":"knowledge-base/eurolinux-8-10-efi-problem/#summary","title":"Summary","text":"

Once more, we are deeply sorry for the inconvenience. The bug skipped our testing and escaped into the public as we were changing the test structure to support new features, including Secure Boot for EuroLinux 9.

We are working on improving our testing process to avoid such mistakes in the future.

If you have any questions or need help, please contact us at support at euro-linux.com. We will dispatch an engineer for a one-on-one session to assist you.

"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/","title":"EuroLinux Linux distribution capabilities and limits","text":"

This document describes the technology capabilities and limits for EuroLinux 6, 7, 8 and 9. Some are theoretical, as they are connected with source code/projects used in the system. Minimal limits represent limits for the systems for which support is generally available by the EuroLinux company. Our dedicated solutions like:

might run and be supported on the less resources than described in this document.

The theoretical limit (connected with a version of the software used) is marked as (LIMIT), when limit supported and tested by upstream is provided as default for EuroLinux. TBA means - To Be Announced.

"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/#minimum-logical-cpu","title":"Minimum logical CPU","text":"

All systems, physical or virtual, require at minimum 1 logical (physical or virtual) CPU core.

"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/#maximum-logical-cpu","title":"Maximum logical CPU","text":"Architecture EuroLinux 6 EuroLinux 7 EuroLinux 8 EuroLinux 9 x86_64 448 (4096) 768 (5120) 768 (8192) 1792 (8192) ARM64 X X 256 512 (4096)"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/#minimum-memory","title":"Minimum memory","text":"

These requirements are only for systems supported as VMs or Physical hosts. In most cases, it's possible to run a system without complications on less memory. The minimum requirements have been provided below because it might not be possible to support systems with less memory.

Architecture EuroLinux 6 EuroLinux 7 EuroLinux 8 EuroLinux 9 x86_64 Minimum 1 GiB, 1 GiB per logical core is recommended Minimum 1 GiB, 1 GiB per logical core is recommended Minimum 1 GiB, 1.5 GiB per logical core is recommended Minimum 1.5 GiB, 1.5 GiB per logical core is recommended ARM64 X X 2GiB 2GiB"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/#maximum-memory","title":"Maximum memory","text":"Architecture EuroLinux 6 EuroLinux 7 EuroLinux 8 EuroLinux 9 x86_64 12TB (64TB) 12TB (64TB) 24TB (64TB) 48TB (64TB) ARM64 X X 1.5TB (256TB) 1.5TB (256TB)"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/#minimum-required-disk-space","title":"Minimum required disk space","text":"EuroLinux 6 EuroLinux 7 EuroLinux 8 EuroLinux 9 1Gib Minimum, 5GiB recommended 5 GiB Minimum, 20 GiB recommended 10 GiB Minimum, 20 GiB recommended 10 GiB Minimum, 20 GiB recommended"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/#file-systems-and-storage-limits","title":"File systems and storage limits","text":"

All filesystems in this document support ACL (Access Control List).

"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/#ext3","title":"Ext3","text":"

Ext3 is mostly a legacy filesystem. Please use Ext4 or XFS.

Feature EuroLinux 6 EuroLinux 7 EuroLinux 8 EuroLinux 9 Maximum File Size 2TiB 2TiB 2TiB 2TiB Maximum Filesystem Size 16TiB 16TiB 16TiB 16TiB Maximum Subdirectories or files in directory 32000 32000 32000 32000 Maximum symlink depth 8 8 8 8"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/#ext4","title":"Ext4","text":"

Ext4 is the default filesystem for EuroLinux 6.

Feature EuroLinux 6 EuroLinux 7 EuroLinux 8 EuroLinux 9 Maximum File Size 16TiB 16TiB 16TiB 16TiB Maximum Filesystem Size 1EiB 1EiB 1EiB 1EiB Maximum Subdirectories or files in directory 65000/unlimited with dir_nlink option 65000/unlimited with dir_nlink option 65000/unlimited with dir_nlink option 65000/unlimited with dir_nlink option Maximum symlink depth 8 8 8 8"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/#xfs","title":"XFS","text":"

XFS is the default filesystem for in EuroLinux 7, 8 and 9.

Feature EuroLinux 6 EuroLinux 7 EuroLinux 8 EuroLinux 9 Maximum File Size 8EiB 8EiB 8EiB 8EiB Maximum Filesystem Size 16EiB 16EiB 1PiB 1PiB Maximum Subdirectories or files in directory unlimited unlimited unlimited unlimited Maximum symlink depth 8 8 8 8"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/#gfs2","title":"GFS2","text":"

Global Filesystem 2 is part of EuroLinux Resilient Storage and High Availability add-ons that are freely available with subscription or free available in the Open Core model.

Feature EuroLinux 6 EuroLinux 7 EuroLinux 8 EuroLinux 9 Maximum File Size 8EiB 8EiB 8EiB 8EiB Maximum Filesystem Size 8EiB 8EiB 8EiB 8EiB Maximum Subdirectories or files in directory unlimited unlimited unlimited unlimited Maximum symlink depth unlimited unlimited unlimited unlimited"},{"location":"knowledge-base/eurolinux-capabilities-and-limits/#kernel-and-the-most-important-components-versions","title":"Kernel and the most important components versions","text":"Feature EuroLinux 6 EuroLinux 7 EuroLinux 8 EuroLinux 9 Base Linux Kernel version 2.6.34 3.10 4.18 5.14 Package Management RPM/Yum RPM/Yum RPM/Dnf, Flatpak RPM/Dnf, Flatpak System Init Upstart systemd systemd systemd Base GNU C Library (glibc) Version 2.12 2.17 2.28 2.34 Base (First) GCC version 4.4.7 4.8.5 8.2.1 (updated in newer versions) 11.2.1 (might be updated in the future) Base (First) LLVM version X X 7.0.1 (updated in newer versions) 13.0.0 (might be updated in the future) Default Desktop Gnome 2 Gnome 3 Gnome 3 Gnome 40 Office Suite LibreOffice LibreOffice LibreOffice LibreOffice Default Web Browser Firefox Firefox Firefox Firefox Default Mail Client Thunderbird Evolution or Thunderbird Evolution or Thunderbird Evolution or Thunderbird"},{"location":"knowledge-base/eurolinux-vault-policy/","title":"EuroLinux Vault and Archiving Policy","text":""},{"location":"knowledge-base/eurolinux-vault-policy/#vault-vaultcdneuro-linuxcom","title":"Vault - vault.cdn.euro-linux.com","text":"

The idea of the vault is simple - it stores older or archived versions of the software packages (mostly RPMs) and allow to create and maintain the environment that requires old versions of the packages, specific libraries or cannot or even must not be updated.

Warning! Security considerations

Due to their nature, the old versions of the software contain security vulnerabilities. Many of them have ready and easy to use exploits. Using unsupported versions of software is a dangerous practice, especially when system is running in the public networks.

"},{"location":"knowledge-base/eurolinux-vault-policy/#vaults-initial-and-last-version-for-minor-releases","title":"Vault's initial and last version for minor releases","text":"

From version 8.6 and 9.0 we decided that we will provide three versions for each minor release (minor release is for example EuroLinux 8.6 -> 8.7 -> 8.8), of the vault. The first one is the initial state of the release, then there is current state (for living release), the third one has '-last' and it's the last snapshot before a new minor release. This idea originated from community feedback. For example in case of EuroLinux 8.7 (that in time of writing this documentation is the latest minor release):

If there is no version with -last suffix it means that this version is a newest minor release or the -last was not created.

"},{"location":"knowledge-base/eurolinux-vault-policy/#vault-for-the-current-version","title":"Vault for the current version","text":"

For your convince EuroLinux Vault also keeps the track of the current version of the EuroLinux as a symbolic link to the newest minor release. The symlinks are 8 for version 8 and 9 for version 9.

These repositories are updated regularly in the same manner as main/mirrors repositories.

"},{"location":"knowledge-base/eurolinux-vault-policy/#eurolinux-sources-on-vaultcdneuro-linuxcom","title":"EuroLinux sources on vault.cdn.euro-linux.com","text":"

We used to provide sources for EuroLinux on GitHub. Unfortunately, due to GitHub's limitations, it wasn't as feasible in long run. Each source needed to be repacked on the client system and source wasn't signed.

We decided to go with a friendlier and more standarized direction after receiving feedback from the community and clients. Since version 8 we deliver the sources as .src.rpms. It's a better solution in many ways, and the advantages include:

The source can be found at https://vault.cdn.euro-linux.com/sources/eurolinux/.

"},{"location":"knowledge-base/eurolinux-vault-policy/#bug-tracker","title":"Bug tracker","text":"

If you encounter any missing sources or problem with vault, please don't hesitate to contact as via e-mail (support[at]euro-linux.com) or fill bug in our distro bug tracker. If you are our client you can contact us on the support site or with sale representative.

"},{"location":"knowledge-base/unable-to-find-requested-software/","title":"Unable to Find Requested Software","text":""},{"location":"knowledge-base/unable-to-find-requested-software/#environment","title":"Environment","text":""},{"location":"knowledge-base/unable-to-find-requested-software/#issue","title":"Issue","text":"

An error occurs during a search for missing components. A similar message is shown by GNOME Software:

Unfortunately, the [...] you were searching for could not be found. Please see [...] for more information.

"},{"location":"knowledge-base/unable-to-find-requested-software/#missing-package","title":"Missing Package","text":"

The package you are searching for is not available in EuroLinux base repositories.

"},{"location":"knowledge-base/unable-to-find-requested-software/#missing-codec","title":"Missing Codec","text":"

The codec you are searching for is not available in EuroLinux base repositories due to licensing reasons or patent encumbrance.

"},{"location":"knowledge-base/unable-to-find-requested-software/#missing-hardware-support","title":"Missing Hardware Support","text":"

A kernel module or a driver is not available in EuroLinux base repositories due to licensing reasons that prohibit redistribution or is not yet in the upstream Linux kernel.

"},{"location":"knowledge-base/unable-to-find-requested-software/#missing-font","title":"Missing Font","text":"

The font you are searching for is not available in EuroLinux base repositories.

"},{"location":"knowledge-base/unable-to-find-requested-software/#missing-mime-support","title":"Missing MIME Support","text":"

An application that supports operations on your file with its MIME type is not available in EuroLinux base repositories due to them being supported exclusively by a third party application or an application that runs only on a platform different than EuroLinux.

"},{"location":"knowledge-base/unable-to-find-requested-software/#resolution","title":"Resolution","text":"

If you would like to request for a certain component availability, please contact us.

"},{"location":"release-notes/8.10/","title":"EuroLinux 8.10 Release Notes","text":"

This version\u2019s code name is Bucharest - the capital of Romania, also known as \u201cParis of the East\u201d.

"},{"location":"release-notes/8.10/#major-changes-in-eurolinux-810","title":"Major changes in EuroLinux 8.10.","text":""},{"location":"release-notes/8.10/#security","title":"Security","text":"

Key security-related highlights:

"},{"location":"release-notes/8.10/#programming-languages-web-and-database-servers","title":"Programming languages, web and database servers","text":"

Later versions of the following application are now available:

The following components have been upgraded:

"},{"location":"release-notes/8.10/#compilers-and-development-tools","title":"Compilers and development tools","text":""},{"location":"release-notes/8.10/#updated-performance-tools-and-debuggers","title":"Updated performance tools and debuggers","text":"

The following performance tools and debuggers have been updated:

"},{"location":"release-notes/8.10/#updated-compiler-toolsets","title":"Updated compiler toolsets","text":"

The following compiler toolsets have been updated:

"},{"location":"release-notes/8.10/#java-implementations-in-eurolinux-8","title":"Java implementations in EuroLinux 8","text":"

The EuroLinux 8 AppStream repository includes:

"},{"location":"release-notes/8.10/#batteries-repositories","title":"Batteries repositories","text":"

Batteries repository contains packages that are needed to rebuild the distribution but are not included in any upstream repositories. Right now, this repository includes more than 3000 packages for each buildroot.

"},{"location":"release-notes/8.10/#known-issues","title":"Known issues","text":""},{"location":"release-notes/8.10/#gaia-build-system","title":"Gaia build system","text":"

We are currently using Gaia 3.0 and preparing 4.0 with branding kit.

"},{"location":"release-notes/8.10/#container-and-cloud-images","title":"Container and cloud images","text":"

You can use the following publicly available images for EuroLinux 8:

"},{"location":"release-notes/8.10/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.3/","title":"EuroLinux 8.3 Release Notes","text":""},{"location":"release-notes/8.3/#dynamic-programming-languages","title":"Dynamic programming languages","text":"

Later versions of the following components are now available:

"},{"location":"release-notes/8.3/#web-and-database-servers","title":"Web and Database servers","text":"

Later versions of the following components are now available

"},{"location":"release-notes/8.3/#compiler-toolsets","title":"Compiler toolsets","text":"

The following compiler toolsets have been updated in EL 8.3:

"},{"location":"release-notes/8.3/#security","title":"Security","text":""},{"location":"release-notes/8.3/#general-updates-and-improvements","title":"General updates and improvements","text":""},{"location":"release-notes/8.3/#identity-management","title":"Identity Management","text":"

The Rivest Cipher 4 (RC4) cipher suite, the default encryption type for users, services, and trusts between Active Directory domains in an Active Directory forest, has been deprecated in EuroLinux 8. For compatibility, this release introduces cryptographic subpolicy named AD-SUPPORT to enable support for this deprecated encryption type. The new subpolicy allows you to use RC4 with EuroLinux IPA and SSSD Active Directory.

"},{"location":"release-notes/8.3/#the-web-console","title":"The web console","text":"

The cockpit web console provides an option to switch between superuser access and limited access from inside of a user session.

"},{"location":"release-notes/8.3/#desktop-and-graphics","title":"Desktop and graphics","text":"

The Direct Rendering Manager (DRM) kernel graphics subsystem has been rebased to upstream Linux kernel version 5.6. It provides a number of enhancements over the previous versions, including support for new GPUs and APUs.

"},{"location":"release-notes/8.4-beta/","title":"EuroLinux Beta 8.4 Release Notes","text":""},{"location":"release-notes/8.4-beta/#dynamic-programming-languages","title":"Dynamic programming languages","text":"

Later versions of the following components are now available:

"},{"location":"release-notes/8.4-beta/#web-and-database-servers","title":"Web and Database servers","text":"

Later versions of the following components are now available:

"},{"location":"release-notes/8.4-beta/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.4:

There is new a module containing Persistent Memory Development Kit (PMDK):

"},{"location":"release-notes/8.4-beta/#security","title":"Security","text":""},{"location":"release-notes/8.4-beta/#general-updates-and-improvements","title":"General updates and improvements","text":""},{"location":"release-notes/8.4-beta/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild distribution but are not included in upstream repositories. Right now, this repository includes more than 2000 packages for each buildroot.

Multiple batteries were updated for this release there including:

"},{"location":"release-notes/8.4-beta/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.4/","title":"EuroLinux 8.4 Release Notes","text":""},{"location":"release-notes/8.4/#dynamic-programming-languages","title":"Dynamic programming languages","text":"

Later versions of the following components are now available:

"},{"location":"release-notes/8.4/#web-and-database-servers","title":"Web and Database servers","text":"

Later versions of the following components are now available:

"},{"location":"release-notes/8.4/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.4:

There is new a module containing Persistent Memory Development Kit (PMDK):

"},{"location":"release-notes/8.4/#security","title":"Security","text":""},{"location":"release-notes/8.4/#general-updates-and-improvements","title":"General updates and improvements","text":""},{"location":"release-notes/8.4/#how-to-update-from-beta","title":"How to update from beta","text":"

The beta repository has an updated package el-release, that contains production repositories. Upgrading from EuroLinux 8.4 beta to 8.4 is as simple as running:

sudo yum update -y el-release\nsudo yum update -y\n
"},{"location":"release-notes/8.4/#branded-packages","title":"Branded packages","text":"

Multiple packages have names changed due to branding, including:

All these packages have proper RPM provides declaration.

The list of the packages that are changed due to branding includes, among the others:

"},{"location":"release-notes/8.4/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild distribution but are not included in upstream repositories. Right now, this repository contains more than 2000 packages for each buildroot.

Multiple batteries were updated for this release there including:

"},{"location":"release-notes/8.4/#other-notable-changes","title":"Other notable changes","text":""},{"location":"release-notes/8.4/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.5-arm64/","title":"EuroLinux 8.5 Release Notes for ARM 64 (aarch64)","text":"

EuroLinux 8.5 is the first version of EuroLinux that provides ARM 64 General Availability. We have to update the Gaia build system in the customers' sites for this release. This version code name is Tirana - the capital city of Albania.

Below you can find the essential changes in EuroLinux 8.5 GA release for aarch64 architecture from EuroLinux 8.4 Beta for ARM64.

"},{"location":"release-notes/8.5-arm64/#dynamic-programming-languages-web-and-database-servers","title":"Dynamic programming languages, Web and Database servers","text":"

New versions of the following components are now available:

"},{"location":"release-notes/8.5-arm64/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.5:

"},{"location":"release-notes/8.5-arm64/#security","title":"Security","text":"

Most of the security features are connected to rebased/updated versions of the packages. The most crucial security changes include:

"},{"location":"release-notes/8.5-arm64/#high-availability-and-resilient-storage","title":"High Availability and Resilient Storage","text":""},{"location":"release-notes/8.5-arm64/#general-updates-and-improvements","title":"General updates and improvements","text":"

Among the others, the following packages were updated and enhanced:

"},{"location":"release-notes/8.5-arm64/#new-packages","title":"New packages","text":"

Among the others, the following packages were added to this release:

"},{"location":"release-notes/8.5-arm64/#how-to-update-from-beta","title":"How to update from beta","text":"

The beta repository has an updated package el-release, that contains production repositories. Upgrading from EuroLinux 8.4 beta for ARM64 to 8.5 GA is as simple as running:

sudo yum update -y el-release\nsudo yum update -y\n
"},{"location":"release-notes/8.5-arm64/#branded-packages","title":"Branded packages","text":"

Multiple packages have names changed due to branding, including:

All these packages have proper RPM provides declaration.

The list of the packages that are changed due to branding includes, among the others:

"},{"location":"release-notes/8.5-arm64/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild the distribution but are not included in upstream repositories. Right now, this repository includes more than 2100 packages for each buildroot.

Multiple batteries were updated for this release there, including:

"},{"location":"release-notes/8.5-arm64/#gaia-build-system","title":"Gaia build system","text":"

Gaia build system was updated in all interested parties' environments. We had to select/order (with current long delivery times)/install hardware for aarch64. We also changed the rebuild policy. None of our customers was interested in using RHEL as a buildroot for their own Enterprise Linux forks. It means that EuroLinux must be released faster, but at the very same time, we can exclusively focus on providing EuroLinux in the early stages and thus release it faster. We also decided that the next version will be released asynchronously with more batch compilation. Batch compilation is scheduled for EuroLinux 9.0 and 8.6.

"},{"location":"release-notes/8.5-arm64/#other-notable-changes","title":"Other notable changes","text":""},{"location":"release-notes/8.5-arm64/#currently-missing-features","title":"Currently missing features","text":""},{"location":"release-notes/8.5-arm64/#container-and-cloud-images","title":"Container and cloud images","text":"

We will work on broader support for cloud/container images based on EuroLinux 8.5 for arm including:

"},{"location":"release-notes/8.5-arm64/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.5/","title":"EuroLinux 8.5 Release Notes","text":"

EuroLinux 8.5 is the first minor release created in a continuous way. It was also the first version when we deployed our engineer to remote sites (in most cases virtual) to provide support for organisations that rebuild RHEL/EuroLinux from sources with Gaia build system. This version code name is Tirana - the capital city of Albania.

Below you can find the essential changes in EuroLinux 8.5 release for x86_64 architecture. The aarch64 GA release is slightly delayed. Release notes for aarch64 will be provided in a separate document.

"},{"location":"release-notes/8.5/#dynamic-programming-languages-web-and-database-servers","title":"Dynamic programming languages, Web and Database servers","text":"

New versions of the following components are now available:

"},{"location":"release-notes/8.5/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.5:

"},{"location":"release-notes/8.5/#security","title":"Security","text":"

Most of the security features are connected to rebased/updated versions of the packages. The most crucial security changes include:

"},{"location":"release-notes/8.5/#high-availability-and-resilient-storage","title":"High Availability and Resilient Storage","text":""},{"location":"release-notes/8.5/#general-updates-and-improvements","title":"General updates and improvements","text":"

Among the others, the following packages were updated and enhanced:

"},{"location":"release-notes/8.5/#new-packages","title":"New packages","text":"

Among the others, the following packages were added to this release:

"},{"location":"release-notes/8.5/#how-to-update-from-beta","title":"How to update from beta","text":"

The beta repository has an updated package el-release, that contains production repositories. Upgrading from EuroLinux 8.5 beta to 8.5 is as simple as running:

sudo yum update -y el-release\nsudo yum update -y\n
"},{"location":"release-notes/8.5/#branded-packages","title":"Branded packages","text":"

Multiple packages have names changed due to branding, including:

All these packages have proper RPM provides declaration.

The list of the packages that are changed due to branding includes, among the others:

"},{"location":"release-notes/8.5/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild the distribution but are not included in upstream repositories. Right now, this repository includes more than 2100 packages for each buildroot.

Multiple batteries were updated for this release there including:

"},{"location":"release-notes/8.5/#gaia-build-system","title":"Gaia build system","text":"

Gaia build system was updated in all interested parties' environments. We also changed the rebuild policy. None of our customers was interested in using RHEL as a buildroot for their own Enterprise Linux forks. It means that EuroLinux must be released faster, but at the very same time, we can exclusively focus on providing EuroLinux in the early stages and thus release it faster. We also decided that the next version will be released asynchronously with more batch compilation. Synchronization was especially problematic in this release as there was a lot of holidays in Poland.

"},{"location":"release-notes/8.5/#other-notable-changes","title":"Other notable changes","text":""},{"location":"release-notes/8.5/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.6-beta/","title":"EuroLinux 8.6 Beta Release Notes","text":"

EuroLinux 8.6 is the first minor release with a full-fledged beta available before the General Availability of the upstream version (RHEL 8.6). The Beta version will allow releasing EuroLinux 8.6 GA faster. We decided to publish x86_64 and corresponding x86_64, i686 open buildroots for this beta. The GA version will release all supported arches simultaneously.

This version\u2019s code name is Kyiv - the capital city of Ukraine.

"},{"location":"release-notes/8.6-beta/#dynamic-programming-languages-web-and-database-servers","title":"Dynamic programming languages, Web and Database servers","text":"

New versions of the following components are now available:

"},{"location":"release-notes/8.6-beta/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.6:

"},{"location":"release-notes/8.6-beta/#containers","title":"Containers","text":""},{"location":"release-notes/8.6-beta/#security","title":"Security","text":"

Most of the security features are connected to rebased/updated versions of the packages. The most crucial security changes include:

"},{"location":"release-notes/8.6-beta/#general-updates-and-improvements","title":"General updates and improvements","text":"

Among the others, the following packages were updated and enhanced:

"},{"location":"release-notes/8.6-beta/#new-packages","title":"New packages","text":"

Among the others, the following packages were added to os repository for this release:

"},{"location":"release-notes/8.6-beta/#branded-packages","title":"Branded packages","text":"

Multiple packages have names changed due to branding, including:

All these packages have proper RPM provides declaration.

The list of the packages that are changed due to branding includes, among the others:

"},{"location":"release-notes/8.6-beta/#removed-packages","title":"Removed packages","text":"

The following packages were removed:

"},{"location":"release-notes/8.6-beta/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild the distribution but are not included in any upstream repositories. Right now, this repository includes more than 2500 packages for each buildroot.

Multiple batteries were updated for this release including:

About 420 packages were updated for x86_64 buildroot alone.

"},{"location":"release-notes/8.6-beta/#gaia-build-system","title":"Gaia build system","text":"

We are still working on Gaia 3.0.

"},{"location":"release-notes/8.6-beta/#known-bugs","title":"Known bugs","text":""},{"location":"release-notes/8.6-beta/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.6/","title":"EuroLinux 8.6 Release Notes","text":"

Since EuroLinux 8.6 was first minor release with a full-fledged beta available before the General Availability of the upstream version (RHEL 8.6), the Beta version allowed us to release EuroLinux 8.6 faster.

This version\u2019s code name is Kyiv - the capital city of Ukraine.

"},{"location":"release-notes/8.6/#dynamic-programming-languages-web-and-database-servers","title":"Dynamic programming languages, Web and Database servers","text":"

New versions of the following components are now available:

"},{"location":"release-notes/8.6/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.6:

"},{"location":"release-notes/8.6/#containers","title":"Containers","text":""},{"location":"release-notes/8.6/#security","title":"Security","text":"

Most of the security features are connected to rebased/updated versions of the packages. The most crucial security changes include:

"},{"location":"release-notes/8.6/#general-updates-and-improvements","title":"General updates and improvements","text":"

Among the others, the following packages were updated and enhanced:

"},{"location":"release-notes/8.6/#new-packages","title":"New packages","text":"

Among the others, the following packages were added to os repository for this release:

"},{"location":"release-notes/8.6/#branded-packages","title":"Branded packages","text":"

Multiple packages have names changed due to branding, including:

All these packages have proper RPM provides declaration.

The list of the packages that are changed due to branding includes, among the others:

"},{"location":"release-notes/8.6/#removed-packages","title":"Removed packages","text":"

The following packages were removed:

"},{"location":"release-notes/8.6/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild the distribution but are not included in any upstream repositories. Right now, this repository includes more than 2500 packages for each buildroot.

Multiple batteries were updated for this release including:

About 420 packages were updated for x86_64 buildroot alone.

"},{"location":"release-notes/8.6/#gaia-build-system","title":"Gaia build system","text":"

We are still working on Gaia 3.0.

"},{"location":"release-notes/8.6/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.7-beta/","title":"EuroLinux 8.7 Beta Release Notes","text":"

EuroLinux 8.7 is the first beta release for x86_64 and aarch64 beta published concurrently. The Beta version will allow us to provide EuroLinux 8.7 faster.

This version\u2019s code name is Brussels - the capital city of Belgium and the heart of European Union.

Older modules removed

In this beta we noticed that a lot of modules were obsoleted or removed, we are waiting for GA version to confirm that there will be a mechanism that should allow smoother migration between modules or that these modules will be available.

"},{"location":"release-notes/8.7-beta/#dynamic-programming-languages-web-and-database-servers","title":"Dynamic programming languages, Web and Database servers","text":"

New versions of the following components are now available:

"},{"location":"release-notes/8.7-beta/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.7:

"},{"location":"release-notes/8.7-beta/#containers","title":"Containers","text":""},{"location":"release-notes/8.7-beta/#security","title":"Security","text":"

Most of the security features are connected to rebased/updated versions of the packages. The most crucial security changes include:

"},{"location":"release-notes/8.7-beta/#general-updates-and-improvements","title":"General updates and improvements","text":"

Among the others, the following packages were updated and enhanced:

"},{"location":"release-notes/8.7-beta/#new-packages","title":"New packages","text":"

Among the others, the following packages were added to os repository for this release:

"},{"location":"release-notes/8.7-beta/#branded-packages","title":"Branded packages","text":"

Multiple packages have names changed due to branding, including:

All these packages have proper RPM provides declaration.

The list of the packages that are changed due to branding includes, among the others:

"},{"location":"release-notes/8.7-beta/#removed-packages","title":"Removed packages","text":"

The following packages were removed:

"},{"location":"release-notes/8.7-beta/#maven-38","title":"Maven 3.8","text":"

Maven 3.8 - module maven stream 3.8 was not introduced in this beta. Currently upstream didn't provide modules metadata for javapackages-tools:202201 and javapackages-bootstrap:202201 that are required to build Maven 3.8. The default profile for javapackages-tools:202201 is available in the Red Hat CodeReady-Builder repository but there is no modular metadata or RPMs.

We manage to create this module in not reproducible way and in worst case scenario we will provide specially crafted VM to build it for orgs that are using Gaia Build System. We decided not to put this module as we are rebuilding EuroLinux multiple times and not reproducible rebuilds are next to impossible to maintain.

"},{"location":"release-notes/8.7-beta/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild the distribution but are not included in any upstream repositories. Right now, this repository includes more than 2500 packages for each buildroot.

About 30 packages were updated for x86_64 buildroot.

"},{"location":"release-notes/8.7-beta/#gaia-build-system","title":"Gaia build system","text":"

We are currently using Gaia 3.0 alpha.

"},{"location":"release-notes/8.7-beta/#eurolinux-91-beta","title":"EuroLinux 9.1 beta","text":"

As we released a brand new EuroLinux Desktop we are working on better test integrations with EuroLinux 9. This process takes time. We should deliver EuroLinux 9.1 beta before EuroLinux 9.1 GA.

"},{"location":"release-notes/8.7-beta/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.7/","title":"EuroLinux 8.7 Release Notes","text":"

This version\u2019s code name is Brussels - the capital city of Belgium and the heart of European Union.

"},{"location":"release-notes/8.7/#dynamic-programming-languages-web-and-database-servers","title":"Dynamic programming languages, Web and Database servers","text":"

New versions of the following components are now available:

"},{"location":"release-notes/8.7/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.6:

"},{"location":"release-notes/8.7/#containers","title":"Containers","text":""},{"location":"release-notes/8.7/#security","title":"Security","text":"

Most of the security features are connected to rebased/updated versions of the packages. The most crucial security changes include:

"},{"location":"release-notes/8.7/#general-updates-and-improvements","title":"General updates and improvements","text":"

Among the others, the following packages were updated and enhanced:

"},{"location":"release-notes/8.7/#new-packages","title":"New packages","text":"

Among the others, the following packages were added to os repository for this release:

"},{"location":"release-notes/8.7/#branded-packages","title":"Branded packages","text":"

Multiple packages have names changed due to branding, including:

All these packages have proper RPM provides declaration.

The list of the packages that are changed due to branding includes, among the others:

"},{"location":"release-notes/8.7/#removed-packages","title":"Removed packages","text":"

The following packages were removed:

"},{"location":"release-notes/8.7/#new-vault-policy","title":"New vault policy","text":"

With feedback from community we decided to add the -last to the EuroLinux 8.6 vaulted versions that represents the last snapshot of the EuroLinux 8.6. More about vault policy here.

"},{"location":"release-notes/8.7/#smaller-base-repositories","title":"Smaller base repositories","text":"

Until now we keeped all produced versions of the same package in base repositories. Upstream policy is to keep only selected versions and the rest in the vaults. It is reasonable as saves a internet bandwith, and put much less stress on the mirroring sites. From EuroLinux 8.7 we will aim to use upstream schema for packages.

Older packages are still available at EuroLinux Vault.

"},{"location":"release-notes/8.7/#installation-from-baseurl-with-treeinfo","title":"Installation from baseurl with .treeinfo","text":"

EuroLinux 8.7 is first release that officially supports the installation from URL leveraging .treeinfo files.

"},{"location":"release-notes/8.7/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild the distribution but are not included in any upstream repositories. Right now, this repository includes more than 2500 packages for each buildroot.

About 30 packages were updated for x86_64 buildroot.

"},{"location":"release-notes/8.7/#gaia-build-system","title":"Gaia build system","text":"

Gaia build system is still in the 3.0 alpha.

"},{"location":"release-notes/8.7/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.8-beta/","title":"EuroLinux 8.8 Beta Release Notes","text":"

This version\u2019s code name is Sofia - the capital city of Bulgaria. The Beta version will allow us to provide EuroLinux 8.8 faster.

Major changes in EuroLinux 8.8 Beta:

"},{"location":"release-notes/8.8-beta/#dynamic-programming-languages-web-and-database-servers","title":"Dynamic programming languages, Web and Database servers","text":"

New versions of the following components are now available:

The following components have been upgraded:

"},{"location":"release-notes/8.8-beta/#updated-performance-monitoring-tools","title":"Updated performance monitoring tools","text":"

The following performance monitoring tools have been updated in EuroLinux 8.8:

"},{"location":"release-notes/8.8-beta/#kernel-version","title":"Kernel version","text":"

EuroLinux 8.8 Beta is distributed with the kernel version 4.18.0-477.

"},{"location":"release-notes/8.8-beta/#compilers-and-development-tools","title":"Compilers and development tools","text":"

The following performance tools and debuggers have been updated in EuroLinux 8.8:

"},{"location":"release-notes/8.8-beta/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.8:

"},{"location":"release-notes/8.8-beta/#security","title":"Security","text":"

The most crucial security changes include:

"},{"location":"release-notes/8.8-beta/#general-updates-and-improvements","title":"General updates and improvements","text":""},{"location":"release-notes/8.8-beta/#new-packages","title":"New packages","text":"

Among the others, the following packages were added to os repository for this release:

"},{"location":"release-notes/8.8-beta/#branded-packages","title":"Branded packages","text":"

Multiple packages have names changed due to branding, including:

All these packages have proper RPM provides declaration.

The list of the packages that are changed due to branding includes, among others:

"},{"location":"release-notes/8.8-beta/#removed-packages","title":"Removed packages","text":"

The following packages were removed:

"},{"location":"release-notes/8.8-beta/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild the distribution but are not included in any upstream repositories. Right now, this repository includes more than 3000 packages for each buildroot.

About 150 packages were updated for x86_64 buildroot alone. We also added some of the packages (like python3.11 for i686) to the publicly available open buildroots.

"},{"location":"release-notes/8.8-beta/#known-issues","title":"Known issues","text":""},{"location":"release-notes/8.8-beta/#gaia-build-system","title":"Gaia build system","text":"

We are currently using Gaia 3.0 beta.

"},{"location":"release-notes/8.8-beta/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.8/","title":"EuroLinux 8.8 Release Notes","text":"

This version\u2019s code name is Sofia - the capital city of Bulgaria.

Major changes in EuroLinux 8.8:

"},{"location":"release-notes/8.8/#dynamic-programming-languages-web-and-database-servers","title":"Dynamic programming languages, Web and Database servers","text":"

New versions of the following components are now available:

The following components have been upgraded:

"},{"location":"release-notes/8.8/#updated-performance-monitoring-tools","title":"Updated performance monitoring tools","text":"

The following performance monitoring tools have been updated in EuroLinux 8.8:

"},{"location":"release-notes/8.8/#kernel-version","title":"Kernel version","text":"

EuroLinux 8.8 is distributed with the kernel version 4.18.0-477.

"},{"location":"release-notes/8.8/#compilers-and-development-tools","title":"Compilers and development tools","text":"

The following performance tools and debuggers have been updated in EuroLinux 8.8:

"},{"location":"release-notes/8.8/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.8:

"},{"location":"release-notes/8.8/#security","title":"Security","text":"

The most crucial security changes include:

"},{"location":"release-notes/8.8/#general-updates-and-improvements","title":"General updates and improvements","text":""},{"location":"release-notes/8.8/#new-packages","title":"New packages","text":"

Among the others, the following packages were added to os repository for this release:

"},{"location":"release-notes/8.8/#branded-packages","title":"Branded packages","text":"

Multiple packages have names changed due to branding, including:

All these packages have proper RPM provides declaration.

The list of the packages that are changed due to branding includes, among others:

"},{"location":"release-notes/8.8/#removed-packages","title":"Removed packages","text":"

The following packages were removed:

"},{"location":"release-notes/8.8/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild the distribution but are not included in any upstream repositories. Right now, this repository includes more than 3000 packages for each buildroot.

About 150 packages were updated for x86_64 buildroot alone. We also added some of the packages (like python3.11 for i686) to the publicly available open buildroots.

"},{"location":"release-notes/8.8/#known-issues","title":"Known issues","text":""},{"location":"release-notes/8.8/#gaia-build-system","title":"Gaia build system","text":"

We are currently using Gaia 3.0 beta.

"},{"location":"release-notes/8.8/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.9-beta/","title":"EuroLinux 8.9 Beta Release Notes","text":"

This version\u2019s code name is Monako - a sovereign city-state in France. The Beta version will allow us to provide EuroLinux 8.9 safer and faster.

Major changes in EuroLinux 8.9 Beta:

"},{"location":"release-notes/8.9-beta/#kernel-version","title":"Kernel version","text":"

EuroLinux 8.9 Beta is distributed with the kernel version 4.18.0-513.

"},{"location":"release-notes/8.9-beta/#new-versions-programming-languages-web-and-database-servers","title":"New versions - Programming languages, Web and Database servers","text":"

New versions of the following components are now available:

"},{"location":"release-notes/8.9-beta/#compilers-and-development-tools","title":"Compilers and development tools","text":"

The following performance tools and debuggers have been updated in EuroLinux 8.9 beta:

"},{"location":"release-notes/8.9-beta/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.9 beta:

"},{"location":"release-notes/8.9-beta/#updated-performance-monitoring-tools","title":"Updated performance monitoring tools","text":"

The following performance monitoring tools have been updated in EuroLinux 8.9:

"},{"location":"release-notes/8.9-beta/#security","title":"Security","text":"

The most crucial security changes include:

"},{"location":"release-notes/8.9-beta/#general-updates-and-improvements","title":"General updates and improvements","text":""},{"location":"release-notes/8.9-beta/#new-packages","title":"New packages","text":"

Among the others, the following packages were added to os repositories for this release:

"},{"location":"release-notes/8.9-beta/#branded-packages","title":"Branded packages","text":"

Multiple packages have names changed due to branding, including:

All these packages have proper RPM provides declaration.

The list of the packages that are changed due to branding includes, among others:

"},{"location":"release-notes/8.9-beta/#removed-packages","title":"Removed packages","text":"

The following packages were removed:

"},{"location":"release-notes/8.9-beta/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild the distribution but are not included in any upstream repositories. Right now, this repository includes more than 3000 packages for each buildroot.

About 50 packages were updated for x86_64 buildroot alone. We also added some of the packages (like python3.11 for i686) to the publicly available open buildroots.

"},{"location":"release-notes/8.9-beta/#known-issues","title":"Known issues","text":""},{"location":"release-notes/8.9-beta/#gaia-build-system","title":"Gaia build system","text":"

We are currently using Gaia 3.0 and preparing 4.0 with branding kit.

"},{"location":"release-notes/8.9-beta/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/8.9/","title":"EuroLinux 8.9 Release Notes","text":"

This version\u2019s code name is Monako - a sovereign city-state in France.

Major changes in EuroLinux 8.9:

"},{"location":"release-notes/8.9/#kernel-version","title":"Kernel version","text":"

EuroLinux 8.9 is distributed with the kernel version 4.18.0-513.

"},{"location":"release-notes/8.9/#new-versions-programming-languages-web-and-database-servers","title":"New versions - Programming languages, Web and Database servers","text":"

New versions of the following components are now available:

"},{"location":"release-notes/8.9/#compilers-and-development-tools","title":"Compilers and development tools","text":"

The following performance tools and debuggers have been updated in EuroLinux 8.9:

"},{"location":"release-notes/8.9/#compiler-toolset","title":"Compiler Toolset","text":"

The following compiler toolsets have been updated in EL 8.9:

"},{"location":"release-notes/8.9/#updated-performance-monitoring-tools","title":"Updated performance monitoring tools","text":"

The following performance monitoring tools have been updated in EuroLinux 8.9:

"},{"location":"release-notes/8.9/#security","title":"Security","text":"

The most crucial security changes include:

"},{"location":"release-notes/8.9/#general-updates-and-improvements","title":"General updates and improvements","text":""},{"location":"release-notes/8.9/#new-packages","title":"New packages","text":"

Among the others, the following packages were added to os repositories for this release:

"},{"location":"release-notes/8.9/#branded-packages","title":"Branded packages","text":"

Multiple packages have names changed due to branding, including:

All these packages have proper RPM provides declaration.

The list of the packages that are changed due to branding includes, among others:

"},{"location":"release-notes/8.9/#removed-packages","title":"Removed packages","text":"

The following packages were removed:

"},{"location":"release-notes/8.9/#batteries","title":"Batteries","text":"

Batteries repository contains packages that are needed to rebuild the distribution but are not included in any upstream repositories. Right now, this repository includes more than 3000 packages for each buildroot.

About 50 packages were updated for x86_64 buildroot alone. We also added some of the packages (like python3.11 for i686) to the publicly available open buildroots.

"},{"location":"release-notes/8.9/#known-issues","title":"Known issues","text":""},{"location":"release-notes/8.9/#gaia-build-system","title":"Gaia build system","text":"

We are currently using Gaia 3.0 and preparing 4.0 with branding kit.

"},{"location":"release-notes/8.9/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/9.0-beta/","title":"EuroLinux 9 Beta Release Notes","text":""},{"location":"release-notes/9.0-beta/#technical-changes-between-eurolinux-9-and-8","title":"Technical changes between EuroLinux 9 and 8","text":""},{"location":"release-notes/9.0-beta/#installer-and-image-creation","title":"Installer and image creation","text":"

In EuroLinux 9.0 you can now use a standalone smart card to both authenticate yourself and gain additional privileges via sudo.

For the typical cases of installing EuroLinux with a medium such as a disk interactively a Quality of Life tweak has been implemented: the Anaconda installer will now automatically activate a network connection if applicable (will try to obtain an address via DHCP).

You can now optionally permit a password-based root login via SSH or completely lock the root account in any case. (While the former is not recommended due to security and disabled in EuroLinux 9 by default, there are valid use cases which we support with this single easy switch)

"},{"location":"release-notes/9.0-beta/#administrative-tools","title":"Administrative tools","text":"

If you want to rename a network interface, it is recommended that you use systemd link files. Check man 5 systemd.link for more information.

Alternatively udev rules may be used. If you need to use the ifcfg tool, please install the initscripts package first since it is not installed by default.

"},{"location":"release-notes/9.0-beta/#security","title":"Security","text":"

EuroLinux 9 provides OpenSSL version 3.0.0. Among other things, the concept of providers has been added, which means that different programs can use different security algorithms depending on their needs. You can imagine a situation where you have implemented solutions where one needs to use FIPS mode, while others need to maintain compliance with less secure policies.

This new version comes with a few security-related implications. The TLS-1.3 protocol requires that a PKCS#11 token supports raw RSA or RSA-PSS signatures.

If this is applicable to your scenario, please configure your software to use TLS up to TLS-1.2. Additionally please edit the file /etc/pki/tls/openssl.cnf and add this snippet at the very end of the [ crypto_policy ] section:

SignatureAlgorithms = RSA+SHA256:RSA+SHA512:RSA+SHA384:ECDSA+SHA256:ECDSA+SHA512:ECDSA+SHA384\nMaxProtocol = TLSv1.2\n
"},{"location":"release-notes/9.0-beta/#developer-tools","title":"Developer tools","text":"

Some of the newest and most reliable technology stacks for developers are available in the repositories. These include:

The EuroLinux 9 platform ships glibc 2.34, which will provide 10 years of business-class stability support and the same amount of software binary interface compatibility time. As a result, programs written today will work the same way 10 years from now.

"},{"location":"release-notes/9.0-beta/#web-servers-and-database-engines","title":"Web servers and database engines","text":"

The following software is now available in our repositories:

HTTP servers:

Proxy servers:

Database engines:

"},{"location":"release-notes/9.0-beta/#security-policies-scap-security-guide","title":"Security Policies - SCAP Security Guide","text":"

The SCAP Security Guide has been updated to version 0.1.57 and made a number of changes from the counterpart we provide in EuroLinux 8:

"},{"location":"release-notes/9.0-beta/#gnome-40","title":"GNOME 40","text":"

GNOME has been updated to GNOME 40, a major step forward from EuroLinux 8's GNOME 3.32.2 , which includes many new features.

GNOME 40 includes a new and improved style, including the user interface, icons and desktop, The Activities look and feel provides a better experience when working, launching applications and arranging your personal workspace - workspaces are now arranged horizontally and the window overview and application grid are available vertically.

Many Quality of Life improvements have also been added, including:

"},{"location":"release-notes/9.0-beta/#notable-changes","title":"Notable changes","text":"

EuroLinux 9 provides refreshed and updated versions of the following packages:

We expect updated versions of these packages to be available in the GA version of RHEL.

"},{"location":"release-notes/9.0-beta/#known-issues","title":"Known issues","text":""},{"location":"release-notes/9.0-beta/#batteries-repositories","title":"Batteries repositories","text":"

The battery repository is available for customers with Golden Key and Gaia subscriptions. There are about 1000 packages that are not part of any build (so they are not included in EuroLinux Open Build roots) but are required to rebuild EuroLinux/Custom Fork from RHEL or Eurolinux sources.

"},{"location":"release-notes/9.0-beta/#eurolinux-9-for-arm","title":"EuroLinux 9 for ARM","text":"

EuroLinux for ARM will use an updated Gaia rebuild stack. We decided that this is an ideal testbed because ARM64 is not as popular as x86_64 architecture. It also allowed us to create x86_64, open build roots for i686 and x86_64 and batteries repos faster. Because creating EuroLinux 9 beta took us about four weeks, ARM should take about two weeks, after updating Gaia Stack, as we have all the necessary batteries and build orders figured out.

"},{"location":"release-notes/9.0-beta/#gaia-updates","title":"Gaia updates","text":"

New Gaia used to rebuild EuroLinux 9 for ARM64 is even more distributed.

There are new commands in Gaia:

Other notable changes:

We will also update hardware requirements for rebuild, including reference build servers for ARM and PowerPC. The rebuilds will start with the release of EuroLinux 9. It will also require updated infrastructure.

"},{"location":"release-notes/9.0-beta/#container-and-cloud-images","title":"Container and cloud images","text":"

You can use the following publicly available images for EuroLinux 9 beta

"},{"location":"release-notes/9.0-beta/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/9.0/","title":"EuroLinux 9 Release Notes","text":""},{"location":"release-notes/9.0/#technical-changes-between-eurolinux-9-and-8","title":"Technical changes between EuroLinux 9 and 8","text":""},{"location":"release-notes/9.0/#installer-and-image-creation","title":"Installer and image creation","text":"

In EuroLinux 9.0 you can now use a standalone smart card to both authenticate yourself and gain additional privileges via sudo.

For the typical cases of installing EuroLinux with a medium such as a disk interactively a Quality of Life tweak has been implemented: the Anaconda installer will now automatically activate a network connection if applicable (will try to obtain an address via DHCP).

You can now optionally permit a password-based root login via SSH or completely lock the root account in any case. (While the former is not recommended due to security and disabled in EuroLinux 9 by default, there are valid use cases which we support with this single easy switch)

"},{"location":"release-notes/9.0/#administrative-tools","title":"Administrative tools","text":"

If you want to rename a network interface, it is recommended that you use systemd link files. Check man 5 systemd.link for more information.

Alternatively udev rules may be used. If you need to use the ifcfg tool, please install the initscripts package first since it is not installed by default.

"},{"location":"release-notes/9.0/#security","title":"Security","text":"

EuroLinux 9 provides OpenSSL version 3.0.0. Among other things, the concept of providers has been added, which means that different programs can use different security algorithms depending on their needs. You can imagine a situation where you have implemented solutions where one needs to use FIPS mode, while others need to maintain compliance with less secure policies.

This new version comes with a few security-related implications. The TLS-1.3 protocol requires that a PKCS#11 token supports raw RSA or RSA-PSS signatures.

If this is applicable to your scenario, please configure your software to use TLS up to TLS-1.2. Additionally please edit the file /etc/pki/tls/openssl.cnf and add this snippet at the very end of the [ crypto_policy ] section:

SignatureAlgorithms = RSA+SHA256:RSA+SHA512:RSA+SHA384:ECDSA+SHA256:ECDSA+SHA512:ECDSA+SHA384\nMaxProtocol = TLSv1.2\n
"},{"location":"release-notes/9.0/#developer-tools","title":"Developer tools","text":"

Some of the newest and most reliable technology stacks for developers are available in the repositories. These include:

The EuroLinux 9 platform ships glibc 2.34, which will provide 10 years of business-class stability support and the same amount of software binary interface compatibility time. As a result, programs written today will work the same way 10 years from now.

"},{"location":"release-notes/9.0/#web-servers-and-database-engines","title":"Web servers and database engines","text":"

The following software is now available in our repositories:

HTTP servers:

Proxy servers:

Database engines:

"},{"location":"release-notes/9.0/#security-policies-scap-security-guide","title":"Security Policies - SCAP Security Guide","text":"

The SCAP Security Guide has been updated to version 0.1.57 and made a number of changes from the counterpart we provide in EuroLinux 8:

"},{"location":"release-notes/9.0/#gnome-40","title":"GNOME 40","text":"

GNOME has been updated to GNOME 40, a major step forward from EuroLinux 8's GNOME 3.32.2 , which includes many new features.

GNOME 40 includes a new and improved style, including the user interface, icons and desktop, The Activities look and feel provides a better experience when working, launching applications and arranging your personal workspace - workspaces are now arranged horizontally and the window overview and application grid are available vertically.

Many Quality of Life improvements have also been added, including:

"},{"location":"release-notes/9.0/#notable-changes","title":"Notable changes","text":"

EuroLinux 9 provides refreshed and updated versions of the following packages:

We expect updated versions of these packages to be available in the GA version of RHEL.

"},{"location":"release-notes/9.0/#known-issues","title":"Known issues","text":""},{"location":"release-notes/9.0/#batteries-repositories","title":"Batteries repositories","text":"

The battery repository is available for customers with Golden Key and Gaia subscriptions. There are about 1000 packages that are not part of any build (so they are not included in EuroLinux Open Build roots) but are required to rebuild EuroLinux/Custom Fork from RHEL or Eurolinux sources.

"},{"location":"release-notes/9.0/#eurolinux-9-for-arm","title":"EuroLinux 9 for ARM","text":"

EuroLinux for ARM will use an updated Gaia rebuild stack. We decided that this is an ideal testbed because ARM64 is not as popular as x86_64 architecture. It also allowed us to create x86_64, open build roots for i686 and x86_64 and batteries repos faster.

"},{"location":"release-notes/9.0/#gaia-updates","title":"Gaia updates","text":"

New Gaia used to rebuild EuroLinux 9 for ARM64 is even more distributed.

There are new commands in Gaia:

Other notable changes:

We will also update hardware requirements for rebuild, including reference build servers for ARM and PowerPC. The rebuilds will start with the release of EuroLinux 9. It will also require updated infrastructure.

"},{"location":"release-notes/9.0/#container-and-cloud-images","title":"Container and cloud images","text":"

You can use the following publicly available images for EuroLinux 9

"},{"location":"release-notes/9.0/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/9.1/","title":"EuroLinux 9.1 Release Notes","text":""},{"location":"release-notes/9.1/#major-changes-in-eurolinux-91","title":"Major changes in EuroLinux 9.1.","text":""},{"location":"release-notes/9.1/#installer-and-image-creation","title":"Installer and image creation","text":"

Image builder on-premise now supports:

Installer support customization size of the /boot partition. -allow-ssh kickstart option allows ssh login as root user.

GRUB bootloader menu is hidden by default.

"},{"location":"release-notes/9.1/#security","title":"Security","text":"

EuroLinux 9.1 introduces Keylime, a remote machine attestation tool using the trusted platform module (TPM) technology. With Keylime, you can verify and continuously monitor the integrity of remote machines.

OpenSSH now supports setting minimum RSA key length. The option to be set is named RequiredRSASize. crypto-policies enforce minimum 2048-bit RSA key length for OpenSSH by default.

NSS no longer support RSA keys shorter than 1023bit.

SELinux user-space packages have been upgraded to version 3.4. Changes: - Improved relabeling performance through parallel relabeling - Support for SHA-256 in the semodule tool - New policy utilities in the libsepol-utils package

"},{"location":"release-notes/9.1/#command-line-tools","title":"Command-line tools","text":"

The following command-line tools have been updated in EuroLinux 9.1: - cronie, now supports a randomized time within range ~ - ReaR, now utilises new variables for executing commands before and after recovery - opencryptoki to version 3.18.0 - lsvpd to version 1.7.14 - libvpd to version 2.2.9 - sysctl supports same syntax for arguments as systemd-sysctl

EuroLinux 9.1 introduces a new package xmlstarlet with which you can parse, query, validate, transform and edit XML files.

"},{"location":"release-notes/9.1/#infrastructure-services","title":"Infrastructure services","text":"

The following infrastructure services tools have been updated in EuroLinux 9.1: - chrony to version 4.2 - unbound to version 1.16.2 - frr to version 8.2.2 - whois package now provides the /usr/bin/mkpasswd binary, which can be used to encrypt a password with the crypt C library interface.

"},{"location":"release-notes/9.1/#networking","title":"Networking","text":"

NetworkManager supports migrating connection profiles from the deprecated ifcfg format to keyfile format.

The MultiPath TCP (MPTCP) code in the kernel has been updated and upstream Linux 5.19.

NetworkManager now clearly indicates that WEP support is not available in EuroLinux 9.

"},{"location":"release-notes/9.1/#programming-languages-web-and-database-servers","title":"Programming languages, web and database servers","text":"

Later versions of the following components are now available as new module streams: - PHP 8.1 - Ruby 3.1 - Node.js 18

The Apache HTTP Server has been updated to version 2.4.53.

"},{"location":"release-notes/9.1/#compilers-and-development-tools","title":"Compilers and development tools","text":""},{"location":"release-notes/9.1/#updated-system-toolchain","title":"Updated system toolchain","text":"

The following system toolchain components have been updated in EuroLinux 9.1: - binutils 2.35.2 - GCC 11.2.1 - glibc 2.34

"},{"location":"release-notes/9.1/#updated-performance-tools-and-debuggers","title":"Updated performance tools and debuggers","text":"

The following performance tools and debuggers have been updated in EuroLinux 9.1: - GDB 10.2 - Valgrind 3.19 - SystemTap 4.7 - Dyninst 12.1.0 - elfutils 0.187

"},{"location":"release-notes/9.1/#updated-performance-monitoring-tools","title":"Updated performance monitoring tools","text":"

The following performance monitoring tools have been updated in EuroLinux 9.1: - Grafana 7.5.13 - PCP 5.3.7

"},{"location":"release-notes/9.1/#updated-compiler-toolsets","title":"Updated compiler toolsets","text":"

The following compiler toolsets have been updated in EuroLinux 9.1: - GCC Toolset 12 - Go Toolset 1.18 - Rust Toolset 1.62 - LLVM Toolset 14.0.6

"},{"location":"release-notes/9.1/#java-implementations-in-eurolinx-91","title":"Java implementations in EuroLinx 9.1","text":"

EuroLinux 9 AppStream repository includes: - java-11-openjdk - OpenJDK 11 Java Runtime Environment and the OpenJDK 11 Java Software Development Kit. - java-17-openjdk - OpenJDK 17 Java Runtime Environment and the OpenJDK 17 Java Software Development Kit. - java-1.8.0-openjdk - OpenJDK 8 Java Runtime Environment and the OpenJDK 8 Java Software Development Kit. - Maven 3.8 has been added as a module stream

"},{"location":"release-notes/9.1/#batteries-repositories","title":"Batteries repositories","text":"

The battery repository is available for customers with Golden Key and Gaia subscriptions. There are about 1000 packages that are not part of any build (so they are not included in EuroLinux Open Build roots) but are required to rebuild EuroLinux/Custom Fork from RHEL or Eurolinux sources.

"},{"location":"release-notes/9.1/#eurolinux-9-for-arm","title":"EuroLinux 9 for ARM","text":"

EuroLinux for ARM will use an updated Gaia rebuild stack. We decided that this is an ideal testbed because ARM64 is not as popular as x86_64 architecture. It also allowed us to create x86_64, open build roots for i686 and x86_64 and batteries repos faster. Because creating EuroLinux 9 beta took us about four weeks, ARM should take about two weeks, after updating Gaia Stack, as we have all the necessary batteries and build orders figured out.

"},{"location":"release-notes/9.1/#gaia-updates","title":"Gaia updates","text":"

New Gaia used to rebuild EuroLinux 9 for ARM64 is even more distributed.

There are new commands in Gaia: - new automodule-update Gaia subcommand, that well - automatically updates modules. No more manual config changes for modules - new automodule-merge Gaia subcommand. This command uses multiple input files (RH/EuroLinux modules files + result build + custom files) to create an updated module definition

Other notable changes: - Striga now creates automodule-* commands - Striga can create --partial commands for module rebuild - Vardoger now supports config files that allows ignoring chosen tests/levels for selected RPMs - A lot of new configs for EuroLinux 9

We will also update hardware requirements for rebuild, including reference build servers for ARM and PowerPC. The rebuilds will start with the release of EuroLinux 9. It will also require updated infrastructure.

"},{"location":"release-notes/9.1/#container-and-cloud-images","title":"Container and cloud images","text":"

You can use the following publicly available images for EuroLinux 9 beta - EuroLinux 9 Vagrant Boxes (libvirt/VMware Workstation/VirtualBox) - EuroLinux 9 Container on the Docker Hub - EuroLinux 9 Container on the Quay.io

"},{"location":"release-notes/9.1/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/9.2/","title":"EuroLinux 9.2 Release Notes","text":""},{"location":"release-notes/9.2/#major-changes-in-eurolinux-92","title":"Major changes in EuroLinux 9.2.","text":""},{"location":"release-notes/9.2/#security","title":"Security","text":"

Key security-related highlights:

"},{"location":"release-notes/9.2/#programming-languages-web-and-database-servers","title":"Programming languages, web and database servers","text":"

Later versions of the following application are now available:

The following components have been upgraded:

"},{"location":"release-notes/9.2/#compilers-and-development-tools","title":"Compilers and development tools","text":"

The following system toolchain components have been updated in EuroLinux 9.2:

"},{"location":"release-notes/9.2/#updated-performance-tools-and-debuggers","title":"Updated performance tools and debuggers","text":"

The following performance tools and debuggers have been updated in EuroLinux 9.2:

"},{"location":"release-notes/9.2/#updated-performance-monitoring-tools","title":"Updated performance monitoring tools","text":"

The following performance monitoring tools have been updated in EuroLinux 9.2:

The following compiler toolsets have been updated in EuroLinux 9.2:

"},{"location":"release-notes/9.2/#installer-and-image-creation","title":"Installer and image creation","text":"

Key highlights for image builder:

"},{"location":"release-notes/9.2/#java-implementations-in-eurolinux-9","title":"Java implementations in EuroLinux 9","text":"

The EuroLinux 9 AppStream repository includes:

The java-11-openjdk packages, which provide the OpenJDK 11 Java Runtime Environment and the OpenJDK 11 Java Software Development Kit. The java-17-openjdk packages, which provide the OpenJDK 17 Java Runtime Environment and the OpenJDK 17 Java Software Development Kit. The java-1.8.0-openjdk packages, which provide the OpenJDK 8 Java Runtime Environment and the OpenJDK 8 Java Software Development Kit.

"},{"location":"release-notes/9.2/#containers","title":"Containers","text":"

Notable changes include:

"},{"location":"release-notes/9.2/#known-issues","title":"Known issues","text":"

Due to changes in the build process, some java packages (java-1.8.0-openjdk, java-11-openjdk, java-17-openjdk) are not updated jet (TODO).

"},{"location":"release-notes/9.2/#batteries-repositories","title":"Batteries repositories","text":"

The battery repository is available for customers with Golden Key and Gaia subscriptions. There are about 330 packages that are not part of any build (so they are not included in EuroLinux Open Build roots) but are required to rebuild EuroLinux/Custom Fork from RHEL or Eurolinux sources.

"},{"location":"release-notes/9.2/#eurolinux-9-for-arm","title":"EuroLinux 9 for ARM","text":"

EuroLinux for ARM will use an updated Gaia rebuild stack. We decided that this is an ideal testbed because ARM64 is not as popular as x86_64 architecture. It also allowed us to create x86_64, open build roots for i686 and x86_64 and batteries repos faster. Because creating EuroLinux 9 took us about four weeks, ARM should take about two weeks, after updating Gaia Stack, as we have all the necessary batteries and build orders figured out.

"},{"location":"release-notes/9.2/#gaia-updates","title":"Gaia updates","text":"

New Gaia used to rebuild EuroLinux 9 for ARM64 is even more distributed.

There are new commands in Gaia: - new automodule-update Gaia subcommand, that well - automatically updates modules. No more manual config changes for modules - new automodule-merge Gaia subcommand. This command uses multiple input files (RH/EuroLinux modules files + result build + custom files) to create an updated module definition

Other notable changes: - Striga now creates automodule-* commands - Striga can create --partial commands for module rebuild - Vardoger now supports config files that allows ignoring chosen tests/levels for selected RPMs - A lot of new configs for EuroLinux 9

We will also update hardware requirements for rebuild, including reference build servers for ARM and PowerPC. The rebuilds will start with the release of EuroLinux 9. It will also require updated infrastructure.

"},{"location":"release-notes/9.2/#container-and-cloud-images","title":"Container and cloud images","text":"

You can use the following publicly available images for EuroLinux 9 - EuroLinux 9 Vagrant Boxes (libvirt/VMware Workstation/VirtualBox) - EuroLinux 9 Container on the Docker Hub - EuroLinux 9 Container on the Quay.io

"},{"location":"release-notes/9.2/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/9.3/","title":"EuroLinux 9.3 Release Notes","text":"

This version's code name is Riga - the capital of Latvia.

"},{"location":"release-notes/9.3/#major-changes-in-eurolinux-93","title":"Major changes in EuroLinux 9.3.","text":""},{"location":"release-notes/9.3/#security","title":"Security","text":"

Key security-related highlights:

"},{"location":"release-notes/9.3/#programming-languages-web-and-database-servers","title":"Programming languages, web and database servers","text":"

Later versions of the following application are now available:

Furthermore, the Apache HTTP Server has been updated to version 2.4.57.

The following components have been upgraded:

"},{"location":"release-notes/9.3/#compilers-and-development-tools","title":"Compilers and development tools","text":"

The following system toolchain components have been updated:

"},{"location":"release-notes/9.3/#updated-performance-tools-and-debuggers","title":"Updated performance tools and debuggers","text":"

The following performance tools and debuggers have been updated:

"},{"location":"release-notes/9.3/#updated-performance-monitoring-tools","title":"Updated performance monitoring tools","text":"

The following performance monitoring tools have been updated:

"},{"location":"release-notes/9.3/#updated-compiler-toolsets","title":"Updated compiler toolsets","text":"

The following compiler toolsets have been updated in:

"},{"location":"release-notes/9.3/#java-implementations-in-eurolinux-9","title":"Java implementations in EuroLinux 9","text":"

The EuroLinux 9 AppStream repository includes:

"},{"location":"release-notes/9.3/#known-issues","title":"Known issues","text":"

Due to evolution of build process updates for Java 21 OpenJDK and SCAP Security Guide are delayed now. They are going to be delivered soon.

"},{"location":"release-notes/9.3/#batteries-repositories","title":"Batteries repositories","text":"

The battery repository is available for customers with Golden Key and Gaia subscriptions. There are about 330 packages that are not part of any build (so they are not included in EuroLinux Open Build roots) but are required to rebuild EuroLinux/Custom Fork from RHEL or Eurolinux sources.

"},{"location":"release-notes/9.3/#container-and-cloud-images","title":"Container and cloud images","text":"

You can use the following publicly available images for EuroLinux 9 - EuroLinux 9 Vagrant Boxes (libvirt/VMware Workstation/VirtualBox) - EuroLinux 9 Container on the Docker Hub - EuroLinux 9 Container on the Quay.io

"},{"location":"release-notes/9.3/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/9.4/","title":"EuroLinux 9.4 Release Notes","text":"

This version's code name is San Marino - the capital of San Marino, the world's oldest republic.

"},{"location":"release-notes/9.4/#major-changes-in-eurolinux-94","title":"Major changes in EuroLinux 9.4.","text":""},{"location":"release-notes/9.4/#security","title":"Security","text":"

Key security-related highlights:

"},{"location":"release-notes/9.4/#programming-languages-web-and-database-servers","title":"Programming languages, web and database servers","text":"

Later versions of the following application are now available:

The following components have been upgraded:

"},{"location":"release-notes/9.4/#compilers-and-development-tools","title":"Compilers and development tools","text":""},{"location":"release-notes/9.4/#updated-performance-tools-and-debuggers","title":"Updated performance tools and debuggers","text":"

The following performance tools and debuggers have been updated:

"},{"location":"release-notes/9.4/#updated-performance-monitoring-tools","title":"Updated performance monitoring tools","text":"

The following performance monitoring tools have been updated:

"},{"location":"release-notes/9.4/#updated-compiler-toolsets","title":"Updated compiler toolsets","text":"

The following compiler toolsets have been updated:

"},{"location":"release-notes/9.4/#java-implementations-in-eurolinux-9","title":"Java implementations in EuroLinux 9","text":"

The EuroLinux 9 AppStream repository includes:

"},{"location":"release-notes/9.4/#known-issues","title":"Known issues","text":"

Due to evolution of build process update for SCAP Security Guide are delayed now. They are going to be delivered soon.

"},{"location":"release-notes/9.4/#batteries-repositories","title":"Batteries repositories","text":"

The battery repository is available for customers with Golden Key and Gaia subscriptions. There are about 330 packages that are not part of any build (so they are not included in EuroLinux Open Build roots) but are required to rebuild EuroLinux/Custom Fork from RHEL or Eurolinux sources.

"},{"location":"release-notes/9.4/#container-and-cloud-images","title":"Container and cloud images","text":"

You can use the following publicly available images for EuroLinux 9:

"},{"location":"release-notes/9.4/#additional-resources","title":"Additional resources","text":""},{"location":"release-notes/ELD/","title":"EuroLinux 9 Desktop","text":"

EuroLinux Desktop is a novelty in the operating system market. It combines the look and functionality of Windows\u00ae and macOS\u00ae with the reliability and security of a server-based Enterprise Linux distribution.

"},{"location":"release-notes/ELD/#overview","title":"Overview","text":"

EuroLinux Desktop is built upon the source code of Red Hat\u00ae Enterprise Linux\u00ae 9. However, it includes a number of changes to the user interface. These primarily concern the system's appearance and usability. GNOME extensions have been used for this purpose. In EuroLinux Desktop, they are pre-configured and available immediately after installation - \"out of the box.\" In addition, the Polish language version of EuroLinux Desktop fills in the gaps in the Polish translations of the extensions and GNOME.

"},{"location":"release-notes/ELD/#appearance-features","title":"Appearance & Features","text":"

In EuroLinux Desktop, there is a translucent dock (taskbar) at the bottom of the screen. It stores icons for favorite applications, notifications and running programs, a button that displays icons for all applications in high magnification, as well as date and time information. It is possible to change the position of the bar to the right, left or top of the desktop, as well as to customize it extensively. The user can customize its height, length, transparency, color, icon spacing and size. The system allows icons to be placed on the desktop as standard, and provides a window maximization and minimization function.

EuroLinux Desktop disables the overview mode and the hotcorner function, which displays the preview mode when you hover the mouse over the top left corner of the screen. When you right-click on the wallpaper, additional menu items appear (including New Text Document). Notification icons from instant messaging or email programs have also been added. EuroLinux Desktop lets you switch day/night themes with a single click on the moon icon in the dock, and allows you to set a schedule for automatic theme switching based on the time of day.

"},{"location":"release-notes/ELD/#multimedia","title":"Multimedia","text":"

EuroLinux Desktop supports many media file formats (mp3, mpg, wma, ts, opus, ogg, mp4, flac, aiff, acc, ac3, avi), as well as the open codecs used for the popular mkv (Matroska) video files. Each of these formats can be run in the default Totem/Videos system player.

"},{"location":"release-notes/ELD/#office-suite","title":"Office Suite","text":"

EuroLinux Desktop includes the LibreOffice suite of office applications. It includes a word processor, spreadsheet, presentation editor, vector graphics editor, mathematical formula editor and relational database management system.

"},{"location":"release-notes/ELD/#software","title":"Software","text":"

EuroLinux Desktop has been integrated with the Flathub repository, providing easy access to more than 2,000 free applications. They can be downloaded from the Software application and installed with a single click. The system also supports applications in AppImage format, the use of which is similar to programs with .exe or .msi extensions. However, in the case of EuroLinux Desktop, the AppImage application is always run from a non-privileged user. The system also allows the use of applications designed for Windows\u00ae, thanks to Steam\u00ae, Lutris or Wine.

"}]} \ No newline at end of file diff --git a/site/404.html b/site/404.html deleted file mode 100644 index e8d68fb..0000000 --- a/site/404.html +++ /dev/null @@ -1,1574 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - EuroLinux Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - - -
-
-
- - - - -
-
- -

404 - Not found

- -
-
- - -
- -
- - - -
-
-
-
- - - - - - - - - - - \ No newline at end of file diff --git a/site/HowTo/centos8-eol-solution/index.html b/site/HowTo/centos8-eol-solution/index.html deleted file mode 100644 index e5bcb88..0000000 --- a/site/HowTo/centos8-eol-solution/index.html +++ /dev/null @@ -1,1801 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - CentOS 8 End of Life - solution - EuroLinux Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

CentOS 8 End of Life - solution

-

Introduction

-

This how-to provides a solution to the problem of CentOS 8 running out of -support.
-With the end of 2021, CentOS ended its life in its stable form -and started functioning as CentOS Stream, a development branch for Red Hat® -Enterprise Linux®. As a result, it stopped receiving proven, stable updates -and its use, especially in production environments, became risky. This is -a very serious problem for many companies and individuals around the world. So -there was an urgent need to find a new source of updates for CentOS in order -to keep it in the infrastructure. A complete solution to this problem is -support switching, that is, pointing to a new repository from which CentOS -will be downloading stable updates. Such a solution is offered by EuroLinux. -It is worth mentioning that both CentOS and RHEL and EuroLinux are systems -built on the same source code, so they provide the same functionality. They -differ mainly in branding.

-

The operation of switching support is simple, reasonably safe and completely -reversible. What is very important, it requires neither reinstallation of the -system nor the applications installed on it. The process consists of switching -the repository, installing the el-release package, updating the system and -reinstalling the system packages in-place. -After the in-place migration, CentOS will still be usable, even in production -environments.

-

All resources used in this tutorial can be found in the additional -resources section.

-

The solution

-

A project named eurolinux-migration-scripts has been created. It contains -among others a script that will take care of the migration automatically. Here -we describe, how to perform the switch successfully.

-

Preparations

-

It's vital that the system be updated to the newest release. Use the following -command:

-
sudo yum update -y
-
-

Running the migration script

-

Then download the latest production-ready -release -of the project containing the script. Unpack the release, visit the -unpacked directory and run the script - usually this will require -right-clicking in the current directory, using the 'Open in Terminal' option -and running this command:

-
sudo bash migrate2eurolinux.sh
-
-

Refer to the project's README for additional commands.

-

After the switch

-

Once the migration has finished, it's recommended to reboot your system:

-
sudo reboot
-
-

Once the system has rebooted, the migration process can be considered -complete.
-In order to quickly verify that it was carried out successfully, we -can check the distribution description:

-
cat /etc/el-release
-
-

As a result we should get a response about the distribution and latest -EuroLinux version.

-

Conclusion

-

As you can see, the process is quick and seamless. You can switch the -repository for RHEL, Oracle Linux, AlmaLinux, and Rocky Linux the same way. -In each case, the process will look almost identical.

-

If you have any questions or concerns, please submit them to the repository -linked in the additional resources section. Thank you.

-

Additional resources

- - - - - - - -
-
- - -
- -
- - - -
-
-
-
- - - - - - - - - - - \ No newline at end of file diff --git a/site/HowTo/create-iso-with-repositories/index.html b/site/HowTo/create-iso-with-repositories/index.html deleted file mode 100644 index 9db667f..0000000 --- a/site/HowTo/create-iso-with-repositories/index.html +++ /dev/null @@ -1,1759 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - How to create ISO file with EuroLinux repositories - EuroLinux Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

How to create ISO file with EuroLinux repositories

-

Creating ISO that contains RPM repositories is a straightforward process. First -you have to mirror repositories locally - mirroring is described in Mirror -EuroLinux Locally How To.

-

To create an ISO file, you need mkiso command that is part of genisoimage -package. You can install it with the following command:

-
sudo yum install -y genisoimage
-
-

Creating ISO with repositories

-

In the example below, we create ISO from the repositories saved in /repos -directory the output is saved to /var/eurolinux-repos.iso. -

sudo mkisofs -R -J -o /var/eurolinux-repos.iso /repos/
-

-

This file could be:

-
    -
  • locally copied to the machine that will be using it
  • -
  • added to ISOs pool of Virtual Machine manager/orchestrator or cloud computing - platform of your choice
  • -
-

Mounting ISO from local file

-

Mounting local ISO file is as simple as:

-
sudo mount -o loop /PATH/TO/ISO /MOUNT/PATH
-
-

example:

-
sudo mount -o loop /var/eurolinux-repos.iso /mnt/mirror
-
-

Mounting ISO from virtual cd-rom device

-

Mounting CD-ROM device is as simple as:

-
sudo mount /dev/DEVICE /MOUNT/PATH
-
-

The following example has ISO mounted as CD-ROM device /dev/sr0:

-
sudo mount /dev/sr0 /mnt/mirror
-
-

Using locally mounted ISO with RPM repositories

-

To use the repositories, that the ISO file provides, create a proper .repo -file that resides inside /etc/yum.repos.d/ directory.

-

Here is an example /etc/yum.repos.d/local-iso.repo file for EuroLinux 7 and -the ISO image attached to /mnt/mirror directory.

-
[base]
-name = EuroLinux 7 x86_64 Base
-baseurl=file:///mnt/mirror/eurolinux-os-7/
-enabled=1
-# Disabled gpgcheck, enable if el-release is already installed on your system
-gpgcheck=0
-gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7
-
-[updates]
-name = EuroLinux 7 x86_64 Updates
-baseurl=file:///mnt/mirror/eurolinux-updates-7/
-enabled=1
-# Disabled gpgcheck, enable if el-release is already installed on your system
-gpgcheck=0
-gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux7
-
- - - - - - -
-
- - -
- -
- - - -
-
-
-
- - - - - - - - - - - \ No newline at end of file diff --git a/site/HowTo/docker/index.html b/site/HowTo/docker/index.html deleted file mode 100644 index f94176b..0000000 --- a/site/HowTo/docker/index.html +++ /dev/null @@ -1,1816 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - Docker - EuroLinux Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Docker

-

How to set up your Docker Community Edition installation.

-

Introduction

-

Use cases

-

Consider the following examples:

-
    -
  • You want a standardized runtime environment across production, QA and - developer scenarios.
  • -
  • You want all the runtime environment's specification in a single file, what - is easy to manage through version control systems.
  • -
  • You want the environment to be reproducible. After all, it's just a matter of - building an image from the specification and once it's done it is already -self-documented on what steps were taken to cook the final image.
  • -
  • You prefer a layered architecture and the ability to cache artifacts across - several images and backup & restore the images easily.
  • -
-

Why use Docker containers over virtual machines?

-

In short: Docker containers utilize Linux's capabilities such as cgroups and -namespaces to create an isolated environment and do not virtualize hardware. -Therefore, they are way more lightweight than virtual machines and can be -brought up in a large scale in a blink of an eye rather than waiting for a -single virtual machine to boot.

-

For more information, take a look at our blog entry on the basics of -containerization.

-

System requirements

-

The following operating systems and architectures are covered by this guide:

-
    -
  • EuroLinux 8 on the x86_64 and aarch64 architecture.
  • -
  • EuroLinux 7 on the x86_64 architecture.
  • -
-

Make sure the containers you want to run are of the same architecture as your -machine.

-

If you need support with installation on the EuroLinux releases this guide does -not cover, please create an appropriate ticket.

-

Installation

-

EuroLinux 8

-

The following steps are based on Docker, Inc. official guide as of -2022.02.01. -We will just use the commands provided as snippets for a quick way of copying -& pasting one snippet for a successful installation.

-

The following snippet installs Docker on EuroLinux 8.6. Other releases may work -as well, but have not been tested. Once a new EuroLinux release is out, this -guide will be updated.

-
-

Docker installation removes podman and buildah

-

Please note that this operation will replace runc with containerd.io -and remove both podman and buildah.

-
-
sudo yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
-which yum-config-manager || sudo yum install -y yum-utils
-sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
-sudo yum install -y docker-ce docker-ce-cli containerd.io --allowerasing
-sudo systemctl enable docker --now
-
-

EuroLinux 7

-

EuroLinux provides their own builds of Docker for EuroLinux 7.

-

Please prepare your EuroMan credentials and enable the -el-server-7-extras-x86_64 channel first, like so:

-
sudo rhn-channel -u "$el_euroman_user" -p "$el_euroman_password" -c el-server-7-extras-x86_64 -a
-
-

Then you are ready to install Docker:

-
sudo yum install -y docker
-sudo systemctl enable docker --now
-
-

What's next?

-

EuroLinux provides several Docker images for you to -use. They are publicly available and free -of charge. Take a look at our entry EuroLinux docker images are now -available -for more information. Additionally, we provide a quick guide for having the -images up and running in no time.

- - - - - - -
-
- - -
- -
- - - -
-
-
-
- - - - - - - - - - - \ No newline at end of file diff --git a/site/HowTo/els/index.html b/site/HowTo/els/index.html deleted file mode 100644 index 1c68e3e..0000000 --- a/site/HowTo/els/index.html +++ /dev/null @@ -1,1719 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - Migrate to EuroELS - EuroLinux Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Migrate to EuroELS

-

This guide is about how to switch your repositories to the ones provided by EuroLinux Extended Life Support.

-

Introduction

-

Enterprise Linuxes 6 ended their life a few years ago. Still, security updates can be provided by several vendors for a fee. That's where EuroELS comes in. You can extend the lifecycle of your Enterprise Linux up to the half of 2024.

-

How to migrate

-

First, make sure that your system is up to date. It should be CentOS 6.10 (minor version 10).

-
su
-yum update -y
-
-

Second, in accordance with good practice, we recommend backing up your machine.

-

Please download the migration script available at this location:

-

https://github.com/EuroLinux/eurolinux-migration-scripts.git

-
wget https://github.com/EuroLinux/eurolinux-migration-scripts/archive/refs/heads/el6-only-switch-repos.zip
-
-

Please unpack the downloaded file:

-
unzip el6-only-switch-repos.zip
-
-

and navigate to the script's directory:

-
cd eurolinux-migration-scripts-el6-only-switch-repos
-
-

To start the switching process, just run the script with administrator privileges:

-
./migrate2eurolinux.sh
-
-

Once the command is executed, we'll get a recommendation to make a backup. Type YES to make the script continue.

-

The script will ask us about our EuroMan credentials. We provide our login and password when asked.

-

The repository switch has completed successfully. We can now update our Enterprise Linux 6 with the command:

-
yum update -y
-
- - - - - - -
-
- - -
- -
- - - -
-
-
-
- - - - - - - - - - - \ No newline at end of file diff --git a/site/HowTo/ha-rs-enable-repository/index.html b/site/HowTo/ha-rs-enable-repository/index.html deleted file mode 100644 index 0024b0e..0000000 --- a/site/HowTo/ha-rs-enable-repository/index.html +++ /dev/null @@ -1,1856 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - How to install High Availability and Resilient Storage in EuroLinux 8 - EuroLinux Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

How to install High Availability and Resilient Storage in EuroLinux 8

-

For EuroLinux 8.4, you should update the el-release package. The newer -version has resilient-storage and high-availability repositories saved in -the /etc/yum.repos.d/certify.repo file.

-
sudo yum update -y el-release
-
-
-

'certify-' prefix

-

Since EuroLinux 8.6 the 'certify-' prefixes in repo URLs and names are no -longer used. These URLs are and will be kept as the symbolic link for -backward compatibility. The certify.repo file will be used for the whole -EuroLinux 8 lifecycle.

-
-

If you cannot update the release package because the new el-release package errata -is not security-related, you might manually add the following to the -/etc/yum.repos.d/certify.repo

-
[high-availability]
-name = EuroLinux High Availability
-baseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/HighAvailability/os
-enabled=0
-gpgcheck=1
-gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8
-
-[resilient-storage]
-name = EuroLinux Resilient Storage
-baseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/ResilientStorage/os
-enabled=0
-gpgcheck=1
-gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8
-
-

Enabling repositories permanently

-

Enabling High Availability and Resilient Storage repository manually

-

Use your favourite text editor and change enabled=0 to enabled=1 for -high-availability and resilient-storage repositories.

-

Before edit: -

[resilient-storage]
-name = EuroLinux Resilient Storage
-baseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/ResilientStorage/os
-enabled=0
-gpgcheck=1
-gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8
-

-

After Edit:

-
[resilient-storage]
-name = EuroLinux Resilient Storage
-baseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/ResilientStorage/os
-enabled=1
-gpgcheck=1
-gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8
-
-

You should do the identical changes for high-availability repositories.

-

Enabling High Availability and Resilient Storage repository with yum-config-manager

-

The yum-config-manager command is part of the yum-utils package. Firstly -let's install that package:

-
sudo yum install -y yum-utils
-
-

Then enable Resilient Storage and High Availability repository with the -following command:

-
sudo yum-config-manager --enable high-availability
-sudo yum-config-manager --enable resilient-storage
-
-

Installing HA and/or Resilient Storage

-

Both High Availability and Resilient Storage have rpm groups, so installing -them is trivial.

-

To install the High Availability add-on, invoke the following command:

-
sudo yum install -y @ha
-
-

To install the Resilient Storage add-on, invoke the following command:

-
sudo yum install -y @resilient-storage
-
-

Basic HA configuration

-

Configuring firewalld

-

Before configuring a firewall, it's appropriate to check if firewalld is actually -running. The standard systemctl is-active command is one of the options.

-
systemctl is-active firewalld
-
-

For a system that has firewalld started and enabled, you might use good -enough configuration with:

-
sudo firewall-cmd --permanent --add-service=high-availability
-sudo firewall-cmd --reload
-
-

Starting pcsd

-

After configuring a firewall, you can start and enable pcsd (PCS GUI and remote -configuration interface) with the following commands: -

sudo systemctl start pcsd.service
-sudo systemctl enable pcsd.service
-

-

To make a very basic test of the pcsd installation, we recommend setting -hacluster user password. As root user, you can, for example invoke:

-
# echo "secret-pass" | passwd hacluster --stdin
-
-

Then login into Pacemaker/Corosync configuration. Use the machine address on -port 2224 (example: https://MACHINE_IP:2224) in your browser. The -username is hacluster with password you set in previous step.

-
-

HTTPS Required

-

Web browser like Firefox and other programs like cURL will report -"Connection reset by peer" or "The connection was reset" when connecting -with cleartext HTTP. -

[root@test1 pcsd]# curl localhost:2224
-curl: (56) Recv failure: Connection reset by peer
-

-
-

From this point you can freely configure High Availability and Resilient -Storage. We recommend using upstream documentation provided in Additional Links -below.

- - - - - - - - -
-
- - -
- -
- - - -
-
-
-
- - - - - - - - - - - \ No newline at end of file diff --git a/site/HowTo/install-epel-on-eurolinux/index.html b/site/HowTo/install-epel-on-eurolinux/index.html deleted file mode 100644 index 0a37615..0000000 --- a/site/HowTo/install-epel-on-eurolinux/index.html +++ /dev/null @@ -1,1711 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - How to Install and Enable EPEL repository on EuroLinux 8 - EuroLinux Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

How to Install and Enable EPEL repository on EuroLinux 8

-

EPEL (Extra Packages for Enterprise Linux) repository is one of the most -popular third-party repositories for the Enterprise Linux family. From the 4th -November EuroLinux team included the original epel-release package from EPEL in -the BaseOS repo. It was the most voted small quality of life change during our -first community meeting. The package is re-signed with a EuroLinux GPG key, so -there is no need to accept an external key to install this particular package.

-

The package version will be checked and updated if necessary during minor -releases.

-
-

EPEL is an external repository that is community supported

-

As a company, we cannot provide proper care in terms of security, quality, -support and lifecycle standards on a third-party repository. Nevertheless, the -EPEL repository has a great history of community support.

-
-

Installing EPEL on EuroLinux

-

Installing EPEL on EuroLinux 8 and EuroLinux 7 is as simple as:

-
sudo yum install -y epel-release
-
-
-

EPEL is enabled by default

-

The base EPEL repository is enabled by default for modular (EuroLinux 8) -and non-modular packages. You can enable debuginfo and source packages in -respective /etc/yum.repos.d/epel*.repo file.

-
-

From this moment, you can install and then use all EPEL goodies like htop, wine or -createrepo.

- - - - - - -
-
- - -
- -
- - - -
-
-
-
- - - - - - - - - - - \ No newline at end of file diff --git a/site/HowTo/migrate_to_rocky_linux/index.html b/site/HowTo/migrate_to_rocky_linux/index.html deleted file mode 100644 index 7c4c9d7..0000000 --- a/site/HowTo/migrate_to_rocky_linux/index.html +++ /dev/null @@ -1,1687 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - Procedure for migrating EuroLinux to RockyLinux - EuroLinux Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Procedure for migrating EuroLinux to RockyLinux

-
    -
  1. Preparation:
  2. -
  3. Ensure a stable and reliable internet connection throughout the entire migration process. This is critical for downloading scripts and packages.
  4. -
  5. Create a full backup of the system to be migrated.
  6. -
  7. Test the recovery procedure to ensure you can restore the system in case of interruption or errors during migration.
  8. -
  9. -

    It is recommended to run the migration in a session manager, e.g., tmux.

    -
  10. -
  11. -

    Download migration scripts:

    -
  12. -
  13. For EL8: -
    curl -O https://raw.githubusercontent.com/EuroLinux/rocky-tools/feature/vaulted_migration/migrate2rocky/migrate2rocky.sh
    -
  14. -
  15. -

    For EL9: -

    curl -O https://raw.githubusercontent.com/EuroLinux/rocky-tools/feature/vaulted_migration/migrate2rocky/migrate2rocky9.sh
    -

    -
  16. -
  17. -

    Migration:

    -
  18. -
  19. -

    Migrating EuroLinux 8 to RockyLinux 8: -

    sudo bash migrate2rocky.sh -r
    -

    -
  20. -
  21. -

    Migrating EuroLinux 9.4 to RockyLinux 9.4:

    -
      -
    • If RockyLinux has not yet released version 9.5: -
      sudo bash migrate2rocky9.sh -r
      -
    • -
    • If RockyLinux has already released version 9.5 or higher: -
      sudo bash migrate2rocky9.sh -rv 9.4
      -
    • -
    -
  22. -
- - - - - - -
-
- - -
- -
- - - -
-
-
-
- - - - - - - - - - - \ No newline at end of file diff --git a/site/HowTo/mirror-eurolinux-locally/index.html b/site/HowTo/mirror-eurolinux-locally/index.html deleted file mode 100644 index 87100b7..0000000 --- a/site/HowTo/mirror-eurolinux-locally/index.html +++ /dev/null @@ -1,1985 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - How to set up internal EuroLinux RPM mirror - EuroLinux Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

How to set up internal EuroLinux RPM mirror

-

This short how-to instructs how to set up your own internal EuroLinux mirror. -External (publicly available) mirrors should not be set up this way.

-

System requirements

-
    -
  • Internet connection for sync server is required
  • -
  • The firewall must allow connection to EuroLinux servers
  • -
  • For each version of EuroLinux, you need about 80 GB of storage
  • -
  • You have to install utilities like reposync and createrepo. The - following command will work on an Enterprise Linux 7 and 8: -
    # --skip-broken because depending on the version not all packages might be present
    -sudo yum install -y createrepo_c createrepo yum-utils dnf-utils --skip-broken
    -
  • -
-

Mirroring EuroLinux 9

-

Making a local mirrors for EuroLinux 8 and EuroLinux 9 is simple because:

-
    -
  • repositories are open
  • -
  • reposync can pull repository metadata, erratas, and modules files - automatically.
  • -
-
-

Use Enterprise Linux 9

-

These instructions have been tested to work properly on Enterprise -Linux 9 and Enterprise Linux 8.

-
-

First, let's create the directory where mirroring configuration will reside: -

sudo mkdir -p /etc/yum-mirror-config
-

-

Then, let's create configuration file for EuroLinux 9 mirroring -/etc/yum-mirror-config/mirror_yum_el9.conf with the contents:

-
[main]
-cachedir=/var/cache/yum/mirror/$basearch/$releasever
-keepcache=0
-debuglevel=2
-logfile=/var/log/mirror-yum-el9.log
-plugins=1
-exactarch=0
-obsoletes=0
-reposdir=/dev/null
-
-[baseos]
-name = EuroLinux BaseOS
-baseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/9/$basearch/BaseOS/os
-enabled=1
-gpgcheck=1
-gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux9
-skip_if_unavailable=1
-
-[appstream]
-name = EuroLinux AppStream
-baseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/9/$basearch/AppStream/os
-enabled=1
-gpgcheck=1
-gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux9
-skip_if_unavailable=1
-
-[crb]
-name = EuroLinux CRB
-baseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/9/$basearch/CRB/os
-enabled=1
-gpgcheck=1
-gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux9
-skip_if_unavailable=1
-
-

Then invoke the command reposync with the following arguments:

-
reposync --downloadcomps --download-metadata -c /etc/yum-mirror-config/mirror_yum_el9.conf -p /repos
-
-

Mirroring EuroLinux 8

-

Making a local mirror for EuroLinux 8 and EuroLinux 9 is simple because:

-
    -
  • repositories are open
  • -
  • reposync can pull repository metadata, erratas, and modules files - automatically.
  • -
-
-

Use Enterprise Linux 8

-

These instructions have been tested to work properly on Enterprise -Linux 8. While everything may work well, it's not recommended to use -other versions.

-
-

First, let's create the file /etc/yum-mirror-config/mirror_yum.conf -with the contents:

-
[main]
-cachedir=/var/cache/yum/mirror/$basearch/$releasever
-keepcache=0
-debuglevel=2
-logfile=/var/log/mirror-yum.log
-plugins=1
-exactarch=0
-obsoletes=0
-reposdir=/dev/null
-
-[baseos]
-name = EuroLinux BaseOS
-baseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/BaseOS/os
-enabled=1
-gpgcheck=1
-gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8
-skip_if_unavailable=1
-
-[appstream]
-name = EuroLinux AppStream
-baseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/AppStream/os
-enabled=1
-gpgcheck=1
-gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8
-skip_if_unavailable=1
-
-[powertools]
-name = EuroLinux PowerTools
-baseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/8/$basearch/PowerTools/os
-enabled=1
-gpgcheck=1
-gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux8
-skip_if_unavailable=1
-
-

Then invoke the command reposync with the following arguments:

-
reposync --downloadcomps --download-metadata -c /etc/yum-mirror-config/mirror_yum.conf -p /repos
-
-

Mirroring EuroLinux 7

-
-

Use Enterprise Linux 7

-

These instructions have been tested to work properly on Enterprise -Linux 7. While everything may work well, it's not recommended to use -other versions.

-
-

The official way

-

EuroLinux 7 is not open-core; therefore, only organizations with a proper -license (EuroMan or Golden Key) can mirror it freely.

-
-

We know

-

We are well aware that it is possible to mirror repos even with a single -license. You can read about that below.

-
-

The official way to mirror EuroLinux repositories is the following:

-
    -
  • You need a proper subscription, like EuroMan or Golden Key
  • -
  • EuroLinux engineer will provide you with SSL certificates that we will name - repo.key and repo.crt and CA that we will name ca.crt
  • -
-

Create the directory /etc/yum-mirror-config/. -With the repokeys residing in that directory, create the file -/etc/yum-mirror-config/mirror_yum.conf with the contents:

-
[main]
-cachedir=/var/cache/yum/mirror/$basearch/$releasever
-keepcache=0
-debuglevel=2
-logfile=/var/log/mirror-yum.log
-exactarch=0
-obsoletes=0
-gpgcheck=0
-plugins=0
-reposdir=/dev/null
-
-[eurolinux-os-7]
-name=el7_x86_64_os
-baseurl=https://cdn.euro-linux.com/dist/eurolinux/server/7/x86_64/os/
-sslclientkey=/etc/yum-mirror-config/repo.key
-sslclientcrt=/etc/yum-mirror-config/repo.crt
-sslcacert=/etc/yum-mirror-config/ca.crt
-
-[eurolinux-updates-7]
-name=el7_x86_64_updates
-baseurl=https://cdn.euro-linux.com/dist/eurolinux/server/7/x86_64/updates/
-sslclientkey=/etc/yum-mirror-config/repo.key
-sslclientcrt=/etc/yum-mirror-config/repo.crt
-sslcacert=/etc/yum-mirror-config/ca.crt
-
-

Then invoke the command reposync with the following arguments:

-
reposync -d -m --download-metadata -c /etc/yum-mirror-config/mirror_yum.conf -p /repos
-
-

When the download finishes, the next step is to create repodata and enable -groups.

-
cd /repos/eurolinux-os-7/; createrepo . -g comps.xml
-cd /repos/eurolinux-updates-7/; createrepo . -g comps.xml
-
-
-

Info

-

Enabling updateinfo (erratas information) is a little bit tricky, because -firstly you have to find the newest updateinfo, unpack it, then invoke -modifyrepo script. It can be automated with the script below.

-
-
REPO_DIR=/repos/eurolinux-os-7/
-unset -v LAST_UI
-# finding the newest file
-for file in "$REPO_DIR"/*updateinfo.xml.gz; do
-  [[ "$file" -nt "$LAST_UI" ]] && LAST_UI=$file
-done
-# unpacking to updateinfo.xml file
-sudo gunzip -c "$LAST_UI"  > "$REPO_DIR/updateinfo.xml"
-# Depending on the system - some has modifrepo.py script some has "normal" command
-/usr/share/createrepo/modifyrepo.py "$REPO_DIR/updateinfo.xml"  "$REPO_DIR/repodata" || modifyrepo "$REPO_DIR/updateinfo.xml"  "$REPO_DIR/repodata"
-
-REPO_DIR=/repos/eurolinux-updates-7/
-unset -v LAST_UI
-for file in "$REPO_DIR"/*updateinfo.xml.gz; do
-  [[ $file -nt $LAST_UI ]] && LAST_UI=$file
-done
-sudo gunzip -c "$LAST_UI"  > "$REPO_DIR/updateinfo.xml"
-# Depending on the system - some has modifrepo.py script some has "normal" command
-/usr/share/createrepo/modifyrepo.py "$REPO_DIR/updateinfo.xml"  "$REPO_DIR/repodata" || modifyrepo "$REPO_DIR/updateinfo.xml"  "$REPO_DIR/repodata"
-
-

The unsupported way

-

There is also the possibility to mirror EuroLinux repositories even with a -single or even test subscription.

-
-

True Product – Real Support – Fair Price

-

We are faithful to our values. We also know that it's always possible to -cheat and not play fair. Please be aware that during support inqury, we -might check if your system is registered and supported. To this day, we -always had pleasure to work with honest companies - please don't ruin that.

-
-
-

Mirroring other distros

-

The instruction allows cloning other distros, including paid ones. If you -want to mirror paid Linux distribution, note that this might breach the -license/license agreement.

-
-

You can mirror EuroLinux or other Enterprise Linux repositories with the -following step:

-
    -
  • Register your system with rhn_register command for EuroLinux or another way - to mirror another system repositories.
  • -
-

Then run the following snippet as root:

-
reposync -d -m --download-metadata --plugins -r el-server-7-x86_64 -p /repos/
-# recreating repodata and updateinfo
-REPO_DIR=/repos/el-server-7-x86_64/
-cd /repos/el-server-7-x86_64/; createrepo . -g comps.xml
-unset -v LAST_UI
-for file in "$REPO_DIR"/*updateinfo.xml.gz; do
-  [[ $file -nt $LAST_UI ]] && LAST_UI=$file
-done
-sudo gunzip -c "$LAST_UI"  > "$REPO_DIR/updateinfo.xml"
-# Depending on the system - some has modifrepo.py script some has "normal" command
-/usr/share/createrepo/modifyrepo.py "$REPO_DIR/updateinfo.xml"  "$REPO_DIR/repodata" || modifyrepo "$REPO_DIR/updateinfo.xml"  "$REPO_DIR/repodata"
-
-

Mirroring EuroLinux 6 ELS

-

First, register your system to EuroLinux EuroMan with the migration scripts - use the el6-only-switch-repos branch for this.

-

Once the system has been registered and is receiving EL6 ELS updates, you can mirror the ELS packages with the following commands. Run them as root:

-
reposync -d -m --download-metadata --plugins -r els-6-x86_64 -p /repos/
-# recreating repodata and updateinfo
-REPO_DIR=/repos/els-6-x86_64/
-cd /repos/els-6-x86_64/; createrepo . -g comps.xml
-unset -v LAST_UI
-for file in "$REPO_DIR"/*updateinfo.xml.gz; do
-  [[ $file -nt $LAST_UI ]] && LAST_UI=$file
-done
-sudo gunzip -c "$LAST_UI"  > "$REPO_DIR/updateinfo.xml"
-# Depending on the system - some has modifrepo.py script some has "normal" command
-/usr/share/createrepo/modifyrepo.py "$REPO_DIR/updateinfo.xml"  "$REPO_DIR/repodata" || modifyrepo "$REPO_DIR/updateinfo.xml"  "$REPO_DIR/repodata"
-
- - - - - - -
-
- - -
- -
- - - -
-
-
-
- - - - - - - - - - - \ No newline at end of file diff --git a/site/HowTo/vagrant-with-libvirt/index.html b/site/HowTo/vagrant-with-libvirt/index.html deleted file mode 100644 index 60a033a..0000000 --- a/site/HowTo/vagrant-with-libvirt/index.html +++ /dev/null @@ -1,1800 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - Vagrant with vagrant-libvirt plugin on Enterprise Linux 8 - EuroLinux Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Vagrant with vagrant-libvirt plugin on Enterprise Linux 8

-

Introduction

-

This guide covers the installation of libvirt and related tools along with the -Vagrant plugin that allows using libvirt as a provider. This has been tested on -a clean installation of EuroLinux 8.5 - only Vagrant has been installed already -as described in Vagrant jumpstart.

-

Terminology

-
    -
  • QEMU - a generic machine emulator
  • -
  • KVM - a virtualisation solution that is native to Linux. Used by QEMU to - achieve near-native performances by executing the guest code directly on - the host CPU
  • -
  • libvirt - a management suite for several hypervisors
  • -
-

While libvirt can manage many virtualisation solutions, in the context of this -document libvirt refers to: QEMU with KVM managed by libvirt.

-

Why prefer libvirt over providers such as VirtualBox?

-

As mentioned, KVM is a native virtualisation solution to Linux. This means a -significant performance -boost -when compared to other providers at the slight cost of portability - if you run -Linux only, then this is your solution of choice!

-

If you have never used libvirt before and just heard about it in this how-to, -there are several goodies worth mentioning. As an example unrelated to Vagrant: -Virt-Manager allows you to get a similar GUI experience out of KVM as that of -e.g. VirtualBox, it is fully Free Software (no worrying about licensing -shenanigans) and is more modular - in fact, there is a libvirt VirtualBox -driver out there.

-

Install the plugin

-

Normally one would invoke a single command: vagrant plugin install -vagrant-libvirt and the plugin would work well out-of-the-box. This is not the -case for Linux distributions from the Enterprise Linux family and Upstream is -aware of that, but as of -today (2021.12.21) it doesn't appear to be resolved.

-

Because of that, you'll need to build additional components and use them with -your Vagrant installation. The following procedure covers all of this and has -been tested to work well with EuroLinux 8.5.

-

Use these commands:

-
[ "$(command -v vagrant)" ] || \
-( read -p "Install Vagrant first before running the following commands" \
-  && exit 1 )
-
-sudo dnf groupinstall "Development Tools" "Virtualization Host" -y
-sudo dnf install cmake libvirt-devel ruby-devel -y
-
-mkdir krb5
-cd krb5
-wget https://vault.cdn.euro-linux.com/sources/eurolinux/8/baseos/x86_64/Packages/k/krb5-1.18.2-8.el8.src.rpm
-rpm2cpio krb5*.src.rpm | cpio -idmv
-tar xf krb5*.tar.gz
-cd krb5*/src
-./configure
-make
-sudo cp -P lib/crypto/libk5crypto.* /opt/vagrant/embedded/lib64/
-cd
-
-mkdir libssh
-cd libssh
-wget https://vault.cdn.euro-linux.com/sources/eurolinux/8/baseos/x86_64/Packages/l/libssh-0.9.4-3.el8.src.rpm
-rpm2cpio libssh*.src.rpm | cpio -idmv
-tar xf libssh*.tar.xz
-mkdir build
-cd build
-cmake ../libssh-*/ -DOPENSSL_ROOT_DIR=/opt/vagrant/embedded/
-make
-sudo cp lib/libssh* /opt/vagrant/embedded/lib64
-cd
-
-vagrant plugin install vagrant-libvirt && rm -rf krb5 libssh
-sudo usermod -a -G libvirt $USER
-
-

Next, log out from all of your sessions (graphical and text) and log in again. -From now on you should be able to run Vagrant boxes with libvirt if all -requirements have been satisfied, e.g. you don't have any other providers -enabled (an equivalent of deploying this guide on a clean installation).

-

Additional resources

- - - - - - - -
-
- - -
- -
- - - -
-
-
-
- - - - - - - - - - - \ No newline at end of file diff --git a/site/HowTo/virtualbox/index.html b/site/HowTo/virtualbox/index.html deleted file mode 100644 index 3366dad..0000000 --- a/site/HowTo/virtualbox/index.html +++ /dev/null @@ -1,1877 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - VirtualBox - EuroLinux Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

VirtualBox

-

How to set up your VirtualBox installation.

-

Introduction

-

Use cases

-

Consider the following examples:

-
    -
  • You use software that doesn't work on your EuroLinux 8 installation.
  • -
  • You want to try out some potentially dangerous actions and don't want to - endanger your machine.
  • -
  • You develop some awesome software and want to test it on several systems for - compatibility
  • -
  • You want an easily reproducible environment that works the same way on every - person's machine
  • -
  • You need a multi-machine laboratory, maybe with several different systems and - don't have the resources for a physical equipment
  • -
-

Why use it over other virtualisation providers?

-

VirtualBox is the provider with a copyleft license and a focus on -interoperability when it comes to supporting different platforms. This allows -you to cooperate with someone running a different operating system and when -exchanging documentation - once written it's applicable to anyone that can run -the software.
-New VirtualBox versions usually support older operating systems too. One can -enjoy the new features on a system, which has recently reached its End of Life, -which can be indispensable for a company that can't migrate yet.

-

System requirements

-

A brief documentation is available at -Upstream's.

-

Your machine shall support hardware virtualisation. If it doesn't, you either -need to perform additional troubleshooting - e.g. enable virtualisation in your -machine's BIOS settings.

-
[ $(grep -cE 'vmx|svm' /proc/cpuinfo) -gt 0 ] && echo "OK"
-
-

Make sure you're running EuroLinux 8 on x86_64 architecture rather than ARM.

-
[ "$(arch)" == "x86_64" ] && echo "OK"
-
-

Installation on EuroLinux 8

-

As of today (2 September 2021), 6.1 is the main VirtualBox branch and this is -the one we install in this guide.
-Assuming your account has been made an administrator during the system -installation process, simply run these commands for an installation:

-
sudo dnf groupinstall "Development Tools" -y
-sudo dnf config-manager \
-  --add-repo=https://download.virtualbox.org/virtualbox/rpm/el/virtualbox.repo
-sudo dnf install VirtualBox-6.1 -y
-
-

VirtualBox should be ready to use!

-

USB devices

-

If you want VirtualBox to support USB devices for your system account, run -this command as well:

-
sudo usermod -a -G vboxusers $USER
-
-

then log out of your graphical session and log in again.

-

Extension Pack

-

VirtualBox doesn't support certain technologies out-of-the-box, e.g. USB -2.0/3.0 or builtin disk encryption, among others. If you want them to be -supported, you will need VirtualBox Extension Pack. Make sure you have read -its license and understand -its implications - you're responsible for compliance.
-You may want to read Upstream's -FAQ for a quick start.

-

Once you're sure you'll be able to comply with the licensing terms, run these -commands to install the Extension Pack:

-
export vbox_version="$(VBoxManage --version | cut -d'r' -f 1)"
-wget "https://download.virtualbox.org/virtualbox/$vbox_version/Oracle_VM_VirtualBox_Extension_Pack-$vbox_version.vbox-extpack"
-yes | sudo VBoxManage extpack install --replace Oracle_VM_VirtualBox_Extension_Pack-$vbox_version.vbox-extpack
-
-

Troubleshooting

-

I can't enable hardware virtualisation and prefer software emulation

-

As Upstream -says, -for software mode you'll need VirtualBox branch 6.0 or older.

-
-

Please also use version 6.0 if you need to run VMs with software -virtualization, as this has been discontinued in 6.1.

-
-

Additional resources

-

Upstream's release pages

-

If you prefer a manual download, check out Upstream's Linux release -pages and use the one they -provide for RHEL 8.

-

RPM Fusion

-

Alternatively you can use RPM Fusion repository for -installation. The software might differ in branding a bit and only the latest -release is provided. Use these commands:

-
sudo dnf localinstall \
-  https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -y
-sudo dnf localinstall --nogpgcheck \
-  https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm -y
-sudo dnf install VirtualBox -y
-sudo akmods --kernels $(uname -r) && sudo systemctl restart vboxdrv.service
-
- - - - - - -
-
- - -
- -
- - - -
-
-
-
- - - - - - - - - - - \ No newline at end of file diff --git a/site/HowTo/z-documentation-markdown/index.html b/site/HowTo/z-documentation-markdown/index.html deleted file mode 100644 index d3f132c..0000000 --- a/site/HowTo/z-documentation-markdown/index.html +++ /dev/null @@ -1,1879 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - Quick markdown and extensions guide - EuroLinux Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - - - -
-
-
- - - - -
-
- - - - - - - -

Quick markdown and extensions guide

-

The first part of this guide is loosely based on Adam Pritchard markdown-here -cheatsheet. -We include it here for contributors as reference and show how different pieces -will be styled. If you are familiar with markdown, and want to skip to this -project specific extensions they start with Admonition:

-

Headers

-

Headers are created with #. -

# H1 This is is reserved for page title/name
-## H2 [Contribution guide] is h2
-### H3 [Headers] is h3
-...
-###### H6
-

-

This is fourth header

-
This is fifth header
-
This is sixth header
-

Headers are essentials, because table of content is based on them.

-

Emphasis

-

Emphasis, aka italics, with *asterisks* or _underscores_. 
-
-Strong emphasis, aka bold, with **asterisks** or __underscores__.
-
-Combined emphasis with **asterisks and _underscores_**.
-
-Strikethrough uses two tildes. ~~Scratch this.~~
-
-Emphasis, aka italics, with asterisks or underscores.

-

Strong emphasis, aka bold, with asterisks or underscores.

-

Combined emphasis with asterisks and underscores.

-

Strikethrough uses two tildes. ~~Scratch this.~~

-

List

-
-

Proper markdown required

-

MK-Docs has proper markdown list ordering that is 1 to 1 with markdown standard.

-

See: Python Markdown Issue 3

-

TLDR: You have indent sub-list and paragraps with 4 spaces

-
-

(In this example, leading and trailing spaces are shown with with dots: ⋅) -

1. First ordered list item
-2. Another item
-⋅⋅⋅⋅* Unordered sub-list. 
-1. Actual numbers don't matter, just that it's a number
-⋅⋅⋅⋅1. Ordered sub-list
-4. And another item.
-
-⋅⋅⋅⋅To create paragraph within list item you need newline and four leading spaces. To have a line⋅⋅
-⋅⋅⋅⋅break without a paragraph, you will need to use two trailing spaces.
-
-!!! info Python markdown quirk
-    Python-Markdown won't reset list without paragraph. Even if list types are
-    not compatybile (ordered vs unordered)
-
-* Unordered list can use asterisks
-- Or minuses
-+ Or pluses
-

-
    -
  1. First ordered list item
  2. -
  3. Another item
      -
    • Unordered sub-list.
    • -
    -
  4. -
  5. Actual numbers don't matter, just that it's a number
      -
    1. Ordered sub-list
    2. -
    -
  6. -
  7. -

    And another item.

    -

    To create paragraph within list item you need newline and four leading spaces. To have a line
    -break without a paragraph, you use two trailing spaces.

    -
  8. -
-
-

Python markdown quirk

-

Python-Markdown won't reset list without paragraph. Even if list types are -not compatybile (ordered vs unordered)

-
-
    -
  • Unordered list can use asterisks
  • -
  • Or minuses
  • -
  • Or pluses
  • -
-

Code blocks

-

To add code block use (without leading space) -

 ```python
- # nice
- for i in range(69, 420):
-   print(i)
- ```
-

-

Example: -

# nice
-for i in range(69, 420):
-  print(i)
-

-

Admonition

-
-

Info

-

This is admontion extension for markdown. It support things like -(info,todo), (warning,caution,attention), (danger,error) and more.

-
-

Code in markdown:

-
!!! info
-    This is admontion extension for markdown. It support things like
-    (info,todo), (warning,caution,attention), (danger,error) and more.
-
-
-

For more information check documentation

-

Check mkdocs-material docs

-
-

Code in markdown: -

!!! warning "For more information check documentation"
-    Check [mkdocs-material docs](https://squidfunk.github.io/mkdocs-material/reference/admonitions/)
-

-

Keyboard Keys

-

Sometimes you might add keys combinations. For example:

-

To use second TY terminal use following key combination Ctrl+Alt+F2

-

To make them visible in nice way you should use following syntax: -

To use second TY terminal use following key combination ++ctrl+alt+f2++
-

- - - - - - -
-
- - -
- -
- - - -
-
-
-
- - - - - - - - - - - \ No newline at end of file diff --git a/site/assets/8-jumpstart/additional-repos.png b/site/assets/8-jumpstart/additional-repos.png deleted file mode 100644 index 256ad56..0000000 Binary files a/site/assets/8-jumpstart/additional-repos.png and /dev/null differ diff --git a/site/assets/8-jumpstart/g-inst-1.png b/site/assets/8-jumpstart/g-inst-1.png deleted file mode 100644 index 9ef1bee..0000000 Binary files a/site/assets/8-jumpstart/g-inst-1.png and /dev/null differ diff --git a/site/assets/8-jumpstart/g-inst-2.png b/site/assets/8-jumpstart/g-inst-2.png deleted file mode 100644 index eb6a9ce..0000000 Binary files a/site/assets/8-jumpstart/g-inst-2.png and /dev/null differ diff --git a/site/assets/8-jumpstart/g-inst-3.png b/site/assets/8-jumpstart/g-inst-3.png deleted file mode 100644 index 7992865..0000000 Binary files a/site/assets/8-jumpstart/g-inst-3.png and /dev/null differ diff --git a/site/assets/8-jumpstart/g-inst-4.png b/site/assets/8-jumpstart/g-inst-4.png deleted file mode 100644 index 561a20f..0000000 Binary files a/site/assets/8-jumpstart/g-inst-4.png and /dev/null differ diff --git a/site/assets/8-jumpstart/g-inst-5.png b/site/assets/8-jumpstart/g-inst-5.png deleted file mode 100644 index 07b45ad..0000000 Binary files a/site/assets/8-jumpstart/g-inst-5.png and /dev/null differ diff --git a/site/assets/8-jumpstart/text-inst-1.png b/site/assets/8-jumpstart/text-inst-1.png deleted file mode 100644 index 5bc6d49..0000000 Binary files a/site/assets/8-jumpstart/text-inst-1.png and /dev/null differ diff --git a/site/assets/8-jumpstart/text-inst-2.png b/site/assets/8-jumpstart/text-inst-2.png deleted file mode 100644 index 5261793..0000000 Binary files a/site/assets/8-jumpstart/text-inst-2.png and /dev/null differ diff --git a/site/assets/8-jumpstart/text-inst-3.png b/site/assets/8-jumpstart/text-inst-3.png deleted file mode 100644 index e3385e0..0000000 Binary files a/site/assets/8-jumpstart/text-inst-3.png and /dev/null differ diff --git a/site/assets/9-beta-jumpstart/additional-repos.png b/site/assets/9-beta-jumpstart/additional-repos.png deleted file mode 100644 index 9f1ec12..0000000 Binary files a/site/assets/9-beta-jumpstart/additional-repos.png and /dev/null differ diff --git a/site/assets/9-beta-jumpstart/g-inst-1.png b/site/assets/9-beta-jumpstart/g-inst-1.png deleted file mode 100644 index ca12888..0000000 Binary files a/site/assets/9-beta-jumpstart/g-inst-1.png and /dev/null differ diff --git a/site/assets/9-beta-jumpstart/g-inst-2.png b/site/assets/9-beta-jumpstart/g-inst-2.png deleted file mode 100644 index 7834779..0000000 Binary files a/site/assets/9-beta-jumpstart/g-inst-2.png and /dev/null differ diff --git a/site/assets/9-beta-jumpstart/g-inst-3.png b/site/assets/9-beta-jumpstart/g-inst-3.png deleted file mode 100644 index 16c08cc..0000000 Binary files a/site/assets/9-beta-jumpstart/g-inst-3.png and /dev/null differ diff --git a/site/assets/9-beta-jumpstart/g-inst-4.png b/site/assets/9-beta-jumpstart/g-inst-4.png deleted file mode 100644 index b1cc4ed..0000000 Binary files a/site/assets/9-beta-jumpstart/g-inst-4.png and /dev/null differ diff --git a/site/assets/9-beta-jumpstart/g-inst-5.png b/site/assets/9-beta-jumpstart/g-inst-5.png deleted file mode 100644 index 85d92ca..0000000 Binary files a/site/assets/9-beta-jumpstart/g-inst-5.png and /dev/null differ diff --git a/site/assets/9-beta-jumpstart/pre-release-software.png b/site/assets/9-beta-jumpstart/pre-release-software.png deleted file mode 100644 index 14d5895..0000000 Binary files a/site/assets/9-beta-jumpstart/pre-release-software.png and /dev/null differ diff --git a/site/assets/9-beta-jumpstart/text-inst-1.png b/site/assets/9-beta-jumpstart/text-inst-1.png deleted file mode 100644 index c9c0b61..0000000 Binary files a/site/assets/9-beta-jumpstart/text-inst-1.png and /dev/null differ diff --git a/site/assets/9-beta-jumpstart/text-inst-2.png b/site/assets/9-beta-jumpstart/text-inst-2.png deleted file mode 100644 index 7b6a407..0000000 Binary files a/site/assets/9-beta-jumpstart/text-inst-2.png and /dev/null differ diff --git a/site/assets/9-beta-jumpstart/text-inst-3.png b/site/assets/9-beta-jumpstart/text-inst-3.png deleted file mode 100644 index 045f700..0000000 Binary files a/site/assets/9-beta-jumpstart/text-inst-3.png and /dev/null differ diff --git a/site/assets/9-beta-jumpstart/text-inst-vnc-prompt.png b/site/assets/9-beta-jumpstart/text-inst-vnc-prompt.png deleted file mode 100644 index dcb2c4d..0000000 Binary files a/site/assets/9-beta-jumpstart/text-inst-vnc-prompt.png and /dev/null differ diff --git a/site/assets/9-jumpstart/additional-repos.png b/site/assets/9-jumpstart/additional-repos.png deleted file mode 100644 index b8814c0..0000000 Binary files a/site/assets/9-jumpstart/additional-repos.png and /dev/null differ diff --git a/site/assets/9-jumpstart/g-inst-1.png b/site/assets/9-jumpstart/g-inst-1.png deleted file mode 100644 index ca12888..0000000 Binary files a/site/assets/9-jumpstart/g-inst-1.png and /dev/null differ diff --git a/site/assets/9-jumpstart/g-inst-2.png b/site/assets/9-jumpstart/g-inst-2.png deleted file mode 100644 index a644d24..0000000 Binary files a/site/assets/9-jumpstart/g-inst-2.png and /dev/null differ diff --git a/site/assets/9-jumpstart/g-inst-3.png b/site/assets/9-jumpstart/g-inst-3.png deleted file mode 100644 index 6593c74..0000000 Binary files a/site/assets/9-jumpstart/g-inst-3.png and /dev/null differ diff --git a/site/assets/9-jumpstart/g-inst-4.png b/site/assets/9-jumpstart/g-inst-4.png deleted file mode 100644 index d8afdb3..0000000 Binary files a/site/assets/9-jumpstart/g-inst-4.png and /dev/null differ diff --git a/site/assets/9-jumpstart/g-inst-5.png b/site/assets/9-jumpstart/g-inst-5.png deleted file mode 100644 index 984be8c..0000000 Binary files a/site/assets/9-jumpstart/g-inst-5.png and /dev/null differ diff --git a/site/assets/9-jumpstart/text-inst-1.png b/site/assets/9-jumpstart/text-inst-1.png deleted file mode 100644 index 915666b..0000000 Binary files a/site/assets/9-jumpstart/text-inst-1.png and /dev/null differ diff --git a/site/assets/9-jumpstart/text-inst-2.png b/site/assets/9-jumpstart/text-inst-2.png deleted file mode 100644 index 7a2d734..0000000 Binary files a/site/assets/9-jumpstart/text-inst-2.png and /dev/null differ diff --git a/site/assets/9-jumpstart/text-inst-3.png b/site/assets/9-jumpstart/text-inst-3.png deleted file mode 100644 index 045f700..0000000 Binary files a/site/assets/9-jumpstart/text-inst-3.png and /dev/null differ diff --git a/site/assets/9-jumpstart/text-inst-vnc-prompt.png b/site/assets/9-jumpstart/text-inst-vnc-prompt.png deleted file mode 100644 index 9837c6b..0000000 Binary files a/site/assets/9-jumpstart/text-inst-vnc-prompt.png and /dev/null differ diff --git a/site/assets/el-logo.png b/site/assets/el-logo.png deleted file mode 100644 index d33b71b..0000000 Binary files a/site/assets/el-logo.png and /dev/null differ diff --git a/site/assets/favicon-white.png b/site/assets/favicon-white.png deleted file mode 100644 index 0afbacb..0000000 Binary files a/site/assets/favicon-white.png and /dev/null differ diff --git a/site/assets/favicon.png b/site/assets/favicon.png deleted file mode 100644 index 24bfbbe..0000000 Binary files a/site/assets/favicon.png and /dev/null differ diff --git a/site/assets/images/favicon.png b/site/assets/images/favicon.png deleted file mode 100644 index 1cf13b9..0000000 Binary files a/site/assets/images/favicon.png and /dev/null differ diff --git a/site/assets/javascripts/bundle.94c44541.min.js b/site/assets/javascripts/bundle.94c44541.min.js deleted file mode 100644 index 1a77477..0000000 --- a/site/assets/javascripts/bundle.94c44541.min.js +++ /dev/null @@ -1,29 +0,0 @@ -"use strict";(()=>{var wi=Object.create;var dr=Object.defineProperty;var Si=Object.getOwnPropertyDescriptor;var Ti=Object.getOwnPropertyNames,kt=Object.getOwnPropertySymbols,Oi=Object.getPrototypeOf,hr=Object.prototype.hasOwnProperty,eo=Object.prototype.propertyIsEnumerable;var Zr=(e,t,r)=>t in e?dr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,R=(e,t)=>{for(var r in t||(t={}))hr.call(t,r)&&Zr(e,r,t[r]);if(kt)for(var r of kt(t))eo.call(t,r)&&Zr(e,r,t[r]);return e};var to=(e,t)=>{var r={};for(var o in e)hr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&kt)for(var o of kt(e))t.indexOf(o)<0&&eo.call(e,o)&&(r[o]=e[o]);return r};var br=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Mi=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Ti(t))!hr.call(e,n)&&n!==r&&dr(e,n,{get:()=>t[n],enumerable:!(o=Si(t,n))||o.enumerable});return e};var Ht=(e,t,r)=>(r=e!=null?wi(Oi(e)):{},Mi(t||!e||!e.__esModule?dr(r,"default",{value:e,enumerable:!0}):r,e));var oo=br((vr,ro)=>{(function(e,t){typeof vr=="object"&&typeof ro!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(vr,function(){"use strict";function e(r){var o=!0,n=!1,i=null,s={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function a(C){return!!(C&&C!==document&&C.nodeName!=="HTML"&&C.nodeName!=="BODY"&&"classList"in C&&"contains"in C.classList)}function c(C){var it=C.type,Ne=C.tagName;return!!(Ne==="INPUT"&&s[it]&&!C.readOnly||Ne==="TEXTAREA"&&!C.readOnly||C.isContentEditable)}function p(C){C.classList.contains("focus-visible")||(C.classList.add("focus-visible"),C.setAttribute("data-focus-visible-added",""))}function l(C){C.hasAttribute("data-focus-visible-added")&&(C.classList.remove("focus-visible"),C.removeAttribute("data-focus-visible-added"))}function f(C){C.metaKey||C.altKey||C.ctrlKey||(a(r.activeElement)&&p(r.activeElement),o=!0)}function u(C){o=!1}function d(C){a(C.target)&&(o||c(C.target))&&p(C.target)}function v(C){a(C.target)&&(C.target.classList.contains("focus-visible")||C.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(C.target))}function b(C){document.visibilityState==="hidden"&&(n&&(o=!0),z())}function z(){document.addEventListener("mousemove",G),document.addEventListener("mousedown",G),document.addEventListener("mouseup",G),document.addEventListener("pointermove",G),document.addEventListener("pointerdown",G),document.addEventListener("pointerup",G),document.addEventListener("touchmove",G),document.addEventListener("touchstart",G),document.addEventListener("touchend",G)}function K(){document.removeEventListener("mousemove",G),document.removeEventListener("mousedown",G),document.removeEventListener("mouseup",G),document.removeEventListener("pointermove",G),document.removeEventListener("pointerdown",G),document.removeEventListener("pointerup",G),document.removeEventListener("touchmove",G),document.removeEventListener("touchstart",G),document.removeEventListener("touchend",G)}function G(C){C.target.nodeName&&C.target.nodeName.toLowerCase()==="html"||(o=!1,K())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",b,!0),z(),r.addEventListener("focus",d,!0),r.addEventListener("blur",v,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var zr=br((Ot,Vr)=>{/*! - * clipboard.js v2.0.11 - * https://clipboardjs.com/ - * - * Licensed MIT © Zeno Rocha - */(function(t,r){typeof Ot=="object"&&typeof Vr=="object"?Vr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Ot=="object"?Ot.ClipboardJS=r():t.ClipboardJS=r()})(Ot,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return Ei}});var s=i(279),a=i.n(s),c=i(370),p=i.n(c),l=i(817),f=i.n(l);function u(U){try{return document.execCommand(U)}catch(O){return!1}}var d=function(O){var S=f()(O);return u("cut"),S},v=d;function b(U){var O=document.documentElement.getAttribute("dir")==="rtl",S=document.createElement("textarea");S.style.fontSize="12pt",S.style.border="0",S.style.padding="0",S.style.margin="0",S.style.position="absolute",S.style[O?"right":"left"]="-9999px";var $=window.pageYOffset||document.documentElement.scrollTop;return S.style.top="".concat($,"px"),S.setAttribute("readonly",""),S.value=U,S}var z=function(O,S){var $=b(O);S.container.appendChild($);var F=f()($);return u("copy"),$.remove(),F},K=function(O){var S=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},$="";return typeof O=="string"?$=z(O,S):O instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(O==null?void 0:O.type)?$=z(O.value,S):($=f()(O),u("copy")),$},G=K;function C(U){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?C=function(S){return typeof S}:C=function(S){return S&&typeof Symbol=="function"&&S.constructor===Symbol&&S!==Symbol.prototype?"symbol":typeof S},C(U)}var it=function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},S=O.action,$=S===void 0?"copy":S,F=O.container,Q=O.target,_e=O.text;if($!=="copy"&&$!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(Q!==void 0)if(Q&&C(Q)==="object"&&Q.nodeType===1){if($==="copy"&&Q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if($==="cut"&&(Q.hasAttribute("readonly")||Q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(_e)return G(_e,{container:F});if(Q)return $==="cut"?v(Q):G(Q,{container:F})},Ne=it;function Pe(U){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Pe=function(S){return typeof S}:Pe=function(S){return S&&typeof Symbol=="function"&&S.constructor===Symbol&&S!==Symbol.prototype?"symbol":typeof S},Pe(U)}function ui(U,O){if(!(U instanceof O))throw new TypeError("Cannot call a class as a function")}function Xr(U,O){for(var S=0;S0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof F.action=="function"?F.action:this.defaultAction,this.target=typeof F.target=="function"?F.target:this.defaultTarget,this.text=typeof F.text=="function"?F.text:this.defaultText,this.container=Pe(F.container)==="object"?F.container:document.body}},{key:"listenClick",value:function(F){var Q=this;this.listener=p()(F,"click",function(_e){return Q.onClick(_e)})}},{key:"onClick",value:function(F){var Q=F.delegateTarget||F.currentTarget,_e=this.action(Q)||"copy",Ct=Ne({action:_e,container:this.container,target:this.target(Q),text:this.text(Q)});this.emit(Ct?"success":"error",{action:_e,text:Ct,trigger:Q,clearSelection:function(){Q&&Q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(F){return ur("action",F)}},{key:"defaultTarget",value:function(F){var Q=ur("target",F);if(Q)return document.querySelector(Q)}},{key:"defaultText",value:function(F){return ur("text",F)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(F){var Q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return G(F,Q)}},{key:"cut",value:function(F){return v(F)}},{key:"isSupported",value:function(){var F=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],Q=typeof F=="string"?[F]:F,_e=!!document.queryCommandSupported;return Q.forEach(function(Ct){_e=_e&&!!document.queryCommandSupported(Ct)}),_e}}]),S}(a()),Ei=yi},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function s(a,c){for(;a&&a.nodeType!==n;){if(typeof a.matches=="function"&&a.matches(c))return a;a=a.parentNode}}o.exports=s},438:function(o,n,i){var s=i(828);function a(l,f,u,d,v){var b=p.apply(this,arguments);return l.addEventListener(u,b,v),{destroy:function(){l.removeEventListener(u,b,v)}}}function c(l,f,u,d,v){return typeof l.addEventListener=="function"?a.apply(null,arguments):typeof u=="function"?a.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(b){return a(b,f,u,d,v)}))}function p(l,f,u,d){return function(v){v.delegateTarget=s(v.target,f),v.delegateTarget&&d.call(l,v)}}o.exports=c},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var s=Object.prototype.toString.call(i);return i!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var s=Object.prototype.toString.call(i);return s==="[object Function]"}},370:function(o,n,i){var s=i(879),a=i(438);function c(u,d,v){if(!u&&!d&&!v)throw new Error("Missing required arguments");if(!s.string(d))throw new TypeError("Second argument must be a String");if(!s.fn(v))throw new TypeError("Third argument must be a Function");if(s.node(u))return p(u,d,v);if(s.nodeList(u))return l(u,d,v);if(s.string(u))return f(u,d,v);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function p(u,d,v){return u.addEventListener(d,v),{destroy:function(){u.removeEventListener(d,v)}}}function l(u,d,v){return Array.prototype.forEach.call(u,function(b){b.addEventListener(d,v)}),{destroy:function(){Array.prototype.forEach.call(u,function(b){b.removeEventListener(d,v)})}}}function f(u,d,v){return a(document.body,u,d,v)}o.exports=c},817:function(o){function n(i){var s;if(i.nodeName==="SELECT")i.focus(),s=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var a=i.hasAttribute("readonly");a||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),a||i.removeAttribute("readonly"),s=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var c=window.getSelection(),p=document.createRange();p.selectNodeContents(i),c.removeAllRanges(),c.addRange(p),s=c.toString()}return s}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,s,a){var c=this.e||(this.e={});return(c[i]||(c[i]=[])).push({fn:s,ctx:a}),this},once:function(i,s,a){var c=this;function p(){c.off(i,p),s.apply(a,arguments)}return p._=s,this.on(i,p,a)},emit:function(i){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[i]||[]).slice(),c=0,p=a.length;for(c;c{"use strict";/*! - * escape-html - * Copyright(c) 2012-2013 TJ Holowaychuk - * Copyright(c) 2015 Andreas Lubbe - * Copyright(c) 2015 Tiancheng "Timothy" Gu - * MIT Licensed - */var Ha=/["'&<>]/;Un.exports=$a;function $a(e){var t=""+e,r=Ha.exec(t);if(!r)return t;var o,n="",i=0,s=0;for(i=r.index;i0&&i[i.length-1])&&(p[0]===6||p[0]===2)){r=0;continue}if(p[0]===3&&(!i||p[1]>i[0]&&p[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function N(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],s;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(a){s={error:a}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(s)throw s.error}}return i}function D(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||a(u,d)})})}function a(u,d){try{c(o[u](d))}catch(v){f(i[0][3],v)}}function c(u){u.value instanceof Ze?Promise.resolve(u.value.v).then(p,l):f(i[0][2],u)}function p(u){a("next",u)}function l(u){a("throw",u)}function f(u,d){u(d),i.shift(),i.length&&a(i[0][0],i[0][1])}}function ao(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof we=="function"?we(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(s){return new Promise(function(a,c){s=e[i](s),n(a,c,s.done,s.value)})}}function n(i,s,a,c){Promise.resolve(c).then(function(p){i({value:p,done:a})},s)}}function k(e){return typeof e=="function"}function at(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var Rt=at(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: -`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` - `):"",this.name="UnsubscriptionError",this.errors=r}});function De(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Ie=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=we(s),c=a.next();!c.done;c=a.next()){var p=c.value;p.remove(this)}}catch(b){t={error:b}}finally{try{c&&!c.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}else s.remove(this);var l=this.initialTeardown;if(k(l))try{l()}catch(b){i=b instanceof Rt?b.errors:[b]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=we(f),d=u.next();!d.done;d=u.next()){var v=d.value;try{so(v)}catch(b){i=i!=null?i:[],b instanceof Rt?i=D(D([],N(i)),N(b.errors)):i.push(b)}}}catch(b){o={error:b}}finally{try{d&&!d.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new Rt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)so(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&De(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&De(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var xr=Ie.EMPTY;function Pt(e){return e instanceof Ie||e&&"closed"in e&&k(e.remove)&&k(e.add)&&k(e.unsubscribe)}function so(e){k(e)?e():e.unsubscribe()}var Ae={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var st={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,s=n.isStopped,a=n.observers;return i||s?xr:(this.currentObservers=null,a.push(r),new Ie(function(){o.currentObservers=null,De(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,s=o.isStopped;n?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new P;return r.source=this,r},t.create=function(r,o){return new bo(r,o)},t}(P);var bo=function(e){ie(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:xr},t}(x);var yt={now:function(){return(yt.delegate||Date).now()},delegate:void 0};var Et=function(e){ie(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=yt);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,s=o._infiniteTimeWindow,a=o._timestampProvider,c=o._windowTime;n||(i.push(r),!s&&i.push(a.now()+c)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,s=n._buffer,a=s.slice(),c=0;c0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=lt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var s=r.actions;o!=null&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==o&&(lt.cancelAnimationFrame(o),r._scheduled=void 0)},t}(jt);var xo=function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o=this._scheduled;this._scheduled=void 0;var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(Wt);var Oe=new xo(go);var L=new P(function(e){return e.complete()});function Ut(e){return e&&k(e.schedule)}function Mr(e){return e[e.length-1]}function Qe(e){return k(Mr(e))?e.pop():void 0}function Me(e){return Ut(Mr(e))?e.pop():void 0}function Nt(e,t){return typeof Mr(e)=="number"?e.pop():t}var mt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Dt(e){return k(e==null?void 0:e.then)}function Vt(e){return k(e[pt])}function zt(e){return Symbol.asyncIterator&&k(e==null?void 0:e[Symbol.asyncIterator])}function qt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Pi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Kt=Pi();function Qt(e){return k(e==null?void 0:e[Kt])}function Yt(e){return io(this,arguments,function(){var r,o,n,i;return $t(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,Ze(r.read())];case 3:return o=s.sent(),n=o.value,i=o.done,i?[4,Ze(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,Ze(n)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function Bt(e){return k(e==null?void 0:e.getReader)}function I(e){if(e instanceof P)return e;if(e!=null){if(Vt(e))return Ii(e);if(mt(e))return Fi(e);if(Dt(e))return ji(e);if(zt(e))return yo(e);if(Qt(e))return Wi(e);if(Bt(e))return Ui(e)}throw qt(e)}function Ii(e){return new P(function(t){var r=e[pt]();if(k(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Fi(e){return new P(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?M(function(n,i){return e(n,i,o)}):ue,xe(1),r?He(t):Fo(function(){return new Jt}))}}function jo(){for(var e=[],t=0;t=2,!0))}function le(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new x}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,c=a===void 0?!0:a;return function(p){var l,f,u,d=0,v=!1,b=!1,z=function(){f==null||f.unsubscribe(),f=void 0},K=function(){z(),l=u=void 0,v=b=!1},G=function(){var C=l;K(),C==null||C.unsubscribe()};return g(function(C,it){d++,!b&&!v&&z();var Ne=u=u!=null?u:r();it.add(function(){d--,d===0&&!b&&!v&&(f=$r(G,c))}),Ne.subscribe(it),!l&&d>0&&(l=new tt({next:function(Pe){return Ne.next(Pe)},error:function(Pe){b=!0,z(),f=$r(K,n,Pe),Ne.error(Pe)},complete:function(){v=!0,z(),f=$r(K,s),Ne.complete()}}),I(C).subscribe(l))})(p)}}function $r(e,t){for(var r=[],o=2;oe.next(document)),e}function q(e,t=document){return Array.from(t.querySelectorAll(e))}function W(e,t=document){let r=ce(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function ce(e,t=document){return t.querySelector(e)||void 0}function Re(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}var na=_(h(document.body,"focusin"),h(document.body,"focusout")).pipe(ke(1),V(void 0),m(()=>Re()||document.body),J(1));function Zt(e){return na.pipe(m(t=>e.contains(t)),X())}function Je(e){return{x:e.offsetLeft,y:e.offsetTop}}function Do(e){return _(h(window,"load"),h(window,"resize")).pipe(Ce(0,Oe),m(()=>Je(e)),V(Je(e)))}function er(e){return{x:e.scrollLeft,y:e.scrollTop}}function dt(e){return _(h(e,"scroll"),h(window,"resize")).pipe(Ce(0,Oe),m(()=>er(e)),V(er(e)))}function Vo(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Vo(e,r)}function T(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)Vo(o,n);return o}function tr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function ht(e){let t=T("script",{src:e});return H(()=>(document.head.appendChild(t),_(h(t,"load"),h(t,"error").pipe(E(()=>Lr(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),A(()=>document.head.removeChild(t)),xe(1))))}var zo=new x,ia=H(()=>typeof ResizeObserver=="undefined"?ht("https://unpkg.com/resize-observer-polyfill"):j(void 0)).pipe(m(()=>new ResizeObserver(e=>{for(let t of e)zo.next(t)})),E(e=>_(Ve,j(e)).pipe(A(()=>e.disconnect()))),J(1));function he(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ye(e){return ia.pipe(w(t=>t.observe(e)),E(t=>zo.pipe(M(({target:r})=>r===e),A(()=>t.unobserve(e)),m(()=>he(e)))),V(he(e)))}function bt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function rr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var qo=new x,aa=H(()=>j(new IntersectionObserver(e=>{for(let t of e)qo.next(t)},{threshold:0}))).pipe(E(e=>_(Ve,j(e)).pipe(A(()=>e.disconnect()))),J(1));function or(e){return aa.pipe(w(t=>t.observe(e)),E(t=>qo.pipe(M(({target:r})=>r===e),A(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function Ko(e,t=16){return dt(e).pipe(m(({y:r})=>{let o=he(e),n=bt(e);return r>=n.height-o.height-t}),X())}var nr={drawer:W("[data-md-toggle=drawer]"),search:W("[data-md-toggle=search]")};function Qo(e){return nr[e].checked}function Ke(e,t){nr[e].checked!==t&&nr[e].click()}function We(e){let t=nr[e];return h(t,"change").pipe(m(()=>t.checked),V(t.checked))}function sa(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function ca(){return _(h(window,"compositionstart").pipe(m(()=>!0)),h(window,"compositionend").pipe(m(()=>!1))).pipe(V(!1))}function Yo(){let e=h(window,"keydown").pipe(M(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:Qo("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),M(({mode:t,type:r})=>{if(t==="global"){let o=Re();if(typeof o!="undefined")return!sa(o,r)}return!0}),le());return ca().pipe(E(t=>t?L:e))}function pe(){return new URL(location.href)}function ot(e,t=!1){if(te("navigation.instant")&&!t){let r=T("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function Bo(){return new x}function Go(){return location.hash.slice(1)}function ir(e){let t=T("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function pa(e){return _(h(window,"hashchange"),e).pipe(m(Go),V(Go()),M(t=>t.length>0),J(1))}function Jo(e){return pa(e).pipe(m(t=>ce(`[id="${t}"]`)),M(t=>typeof t!="undefined"))}function jr(e){let t=matchMedia(e);return Xt(r=>t.addListener(()=>r(t.matches))).pipe(V(t.matches))}function Xo(){let e=matchMedia("print");return _(h(window,"beforeprint").pipe(m(()=>!0)),h(window,"afterprint").pipe(m(()=>!1))).pipe(V(e.matches))}function Wr(e,t){return e.pipe(E(r=>r?t():L))}function ar(e,t){return new P(r=>{let o=new XMLHttpRequest;o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network Error"))}),o.addEventListener("abort",()=>{r.error(new Error("Request aborted"))}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{t.progress$.next(n.loaded/n.total*100)}),t.progress$.next(5)),o.send()})}function Ue(e,t){return ar(e,t).pipe(E(r=>r.text()),m(r=>JSON.parse(r)),J(1))}function Zo(e,t){let r=new DOMParser;return ar(e,t).pipe(E(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),J(1))}function en(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function tn(){return _(h(window,"scroll",{passive:!0}),h(window,"resize",{passive:!0})).pipe(m(en),V(en()))}function rn(){return{width:innerWidth,height:innerHeight}}function on(){return h(window,"resize",{passive:!0}).pipe(m(rn),V(rn()))}function nn(){return B([tn(),on()]).pipe(m(([e,t])=>({offset:e,size:t})),J(1))}function sr(e,{viewport$:t,header$:r}){let o=t.pipe(ee("size")),n=B([o,r]).pipe(m(()=>Je(e)));return B([r,t,n]).pipe(m(([{height:i},{offset:s,size:a},{x:c,y:p}])=>({offset:{x:s.x-c,y:s.y-p+i},size:a})))}function la(e){return h(e,"message",t=>t.data)}function ma(e){let t=new x;return t.subscribe(r=>e.postMessage(r)),t}function an(e,t=new Worker(e)){let r=la(t),o=ma(t),n=new x;n.subscribe(o);let i=o.pipe(Z(),re(!0));return n.pipe(Z(),qe(r.pipe(Y(i))),le())}var fa=W("#__config"),vt=JSON.parse(fa.textContent);vt.base=`${new URL(vt.base,pe())}`;function me(){return vt}function te(e){return vt.features.includes(e)}function be(e,t){return typeof t!="undefined"?vt.translations[e].replace("#",t.toString()):vt.translations[e]}function Ee(e,t=document){return W(`[data-md-component=${e}]`,t)}function oe(e,t=document){return q(`[data-md-component=${e}]`,t)}function ua(e){let t=W(".md-typeset > :first-child",e);return h(t,"click",{once:!0}).pipe(m(()=>W(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function sn(e){if(!te("announce.dismiss")||!e.childElementCount)return L;if(!e.hidden){let t=W(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return H(()=>{let t=new x;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),ua(e).pipe(w(r=>t.next(r)),A(()=>t.complete()),m(r=>R({ref:e},r)))})}function da(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function cn(e,t){let r=new x;return r.subscribe(({hidden:o})=>{e.hidden=o}),da(e,t).pipe(w(o=>r.next(o)),A(()=>r.complete()),m(o=>R({ref:e},o)))}function ha(e,t){let r=H(()=>B([Do(e),dt(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:s,height:a}=he(e);return{x:o-i.x+s/2,y:n-i.y+a/2}}));return Zt(e).pipe(E(o=>r.pipe(m(n=>({active:o,offset:n})),xe(+!o||1/0))))}function pn(e,t,{target$:r}){let[o,n]=Array.from(e.children);return H(()=>{let i=new x,s=i.pipe(Z(),re(!0));return i.subscribe({next({offset:a}){e.style.setProperty("--md-tooltip-x",`${a.x}px`),e.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),or(e).pipe(Y(s)).subscribe(a=>{e.toggleAttribute("data-md-visible",a)}),_(i.pipe(M(({active:a})=>a)),i.pipe(ke(250),M(({active:a})=>!a))).subscribe({next({active:a}){a?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(Ce(16,Oe)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(Ir(125,Oe),M(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?e.style.setProperty("--md-tooltip-0",`${-a}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),h(n,"click").pipe(Y(s),M(a=>!(a.metaKey||a.ctrlKey))).subscribe(a=>{a.stopPropagation(),a.preventDefault()}),h(n,"mousedown").pipe(Y(s),ne(i)).subscribe(([a,{active:c}])=>{var p;if(a.button!==0||a.metaKey||a.ctrlKey)a.preventDefault();else if(c){a.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(p=Re())==null||p.blur()}}),r.pipe(Y(s),M(a=>a===o),ze(125)).subscribe(()=>e.focus()),ha(e,t).pipe(w(a=>i.next(a)),A(()=>i.complete()),m(a=>R({ref:e},a)))})}function Ur(e){return T("div",{class:"md-tooltip",id:e},T("div",{class:"md-tooltip__inner md-typeset"}))}function ln(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return T("aside",{class:"md-annotation",tabIndex:0},Ur(t),T("a",{href:r,class:"md-annotation__index",tabIndex:-1},T("span",{"data-md-annotation-id":e})))}else return T("aside",{class:"md-annotation",tabIndex:0},Ur(t),T("span",{class:"md-annotation__index",tabIndex:-1},T("span",{"data-md-annotation-id":e})))}function mn(e){return T("button",{class:"md-clipboard md-icon",title:be("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}function Nr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(c=>!e.terms[c]).reduce((c,p)=>[...c,T("del",null,p)," "],[]).slice(0,-1),i=me(),s=new URL(e.location,i.base);te("search.highlight")&&s.searchParams.set("h",Object.entries(e.terms).filter(([,c])=>c).reduce((c,[p])=>`${c} ${p}`.trim(),""));let{tags:a}=me();return T("a",{href:`${s}`,class:"md-search-result__link",tabIndex:-1},T("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&T("div",{class:"md-search-result__icon md-icon"}),r>0&&T("h1",null,e.title),r<=0&&T("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&e.tags.map(c=>{let p=a?c in a?`md-tag-icon md-tag--${a[c]}`:"md-tag-icon":"";return T("span",{class:`md-tag ${p}`},c)}),o>0&&n.length>0&&T("p",{class:"md-search-result__terms"},be("search.result.term.missing"),": ",...n)))}function fn(e){let t=e[0].score,r=[...e],o=me(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),s=r.findIndex(l=>l.scoreNr(l,1)),...c.length?[T("details",{class:"md-search-result__more"},T("summary",{tabIndex:-1},T("div",null,c.length>0&&c.length===1?be("search.result.more.one"):be("search.result.more.other",c.length))),...c.map(l=>Nr(l,1)))]:[]];return T("li",{class:"md-search-result__item"},p)}function un(e){return T("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>T("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?tr(r):r)))}function Dr(e){let t=`tabbed-control tabbed-control--${e}`;return T("div",{class:t,hidden:!0},T("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function dn(e){return T("div",{class:"md-typeset__scrollwrap"},T("div",{class:"md-typeset__table"},e))}function ba(e){let t=me(),r=new URL(`../${e.version}/`,t.base);return T("li",{class:"md-version__item"},T("a",{href:`${r}`,class:"md-version__link"},e.title))}function hn(e,t){return T("div",{class:"md-version"},T("button",{class:"md-version__current","aria-label":be("select.version")},t.title),T("ul",{class:"md-version__list"},e.map(ba)))}function va(e){return e.tagName==="CODE"?q(".c, .c1, .cm",e):[e]}function ga(e){let t=[];for(let r of va(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let s;for(;s=/(\(\d+\))(!)?/.exec(i.textContent);){let[,a,c]=s;if(typeof c=="undefined"){let p=i.splitText(s.index);i=p.splitText(a.length),t.push(p)}else{i.textContent=a,t.push(i);break}}}}return t}function bn(e,t){t.append(...Array.from(e.childNodes))}function cr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,s=new Map;for(let a of ga(t)){let[,c]=a.textContent.match(/\((\d+)\)/);ce(`:scope > li:nth-child(${c})`,e)&&(s.set(c,ln(c,i)),a.replaceWith(s.get(c)))}return s.size===0?L:H(()=>{let a=new x,c=a.pipe(Z(),re(!0)),p=[];for(let[l,f]of s)p.push([W(".md-typeset",f),W(`:scope > li:nth-child(${l})`,e)]);return o.pipe(Y(c)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of p)l?bn(f,u):bn(u,f)}),_(...[...s].map(([,l])=>pn(l,t,{target$:r}))).pipe(A(()=>a.complete()),le())})}function vn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return vn(t)}}function gn(e,t){return H(()=>{let r=vn(e);return typeof r!="undefined"?cr(r,e,t):L})}var yn=Ht(zr());var xa=0;function En(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return En(t)}}function xn(e){return ye(e).pipe(m(({width:t})=>({scrollable:bt(e).width>t})),ee("scrollable"))}function wn(e,t){let{matches:r}=matchMedia("(hover)"),o=H(()=>{let n=new x;if(n.subscribe(({scrollable:s})=>{s&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")}),yn.default.isSupported()&&(e.closest(".copy")||te("content.code.copy")&&!e.closest(".no-copy"))){let s=e.closest("pre");s.id=`__code_${xa++}`,s.insertBefore(mn(s.id),e)}let i=e.closest(".highlight");if(i instanceof HTMLElement){let s=En(i);if(typeof s!="undefined"&&(i.classList.contains("annotate")||te("content.code.annotate"))){let a=cr(s,e,t);return xn(e).pipe(w(c=>n.next(c)),A(()=>n.complete()),m(c=>R({ref:e},c)),qe(ye(i).pipe(m(({width:c,height:p})=>c&&p),X(),E(c=>c?a:L))))}}return xn(e).pipe(w(s=>n.next(s)),A(()=>n.complete()),m(s=>R({ref:e},s)))});return te("content.lazy")?or(e).pipe(M(n=>n),xe(1),E(()=>o)):o}function ya(e,{target$:t,print$:r}){let o=!0;return _(t.pipe(m(n=>n.closest("details:not([open])")),M(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(M(n=>n||!o),w(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Sn(e,t){return H(()=>{let r=new x;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),ya(e,t).pipe(w(o=>r.next(o)),A(()=>r.complete()),m(o=>R({ref:e},o)))})}var Tn=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel rect,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel rect{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.attributeBoxEven,.attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var qr,wa=0;function Sa(){return typeof mermaid=="undefined"||mermaid instanceof Element?ht("https://unpkg.com/mermaid@9.4.3/dist/mermaid.min.js"):j(void 0)}function On(e){return e.classList.remove("mermaid"),qr||(qr=Sa().pipe(w(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Tn,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),J(1))),qr.subscribe(()=>{e.classList.add("mermaid");let t=`__mermaid_${wa++}`,r=T("div",{class:"mermaid"}),o=e.textContent;mermaid.mermaidAPI.render(t,o,(n,i)=>{let s=r.attachShadow({mode:"closed"});s.innerHTML=n,e.replaceWith(r),i==null||i(s)})}),qr.pipe(m(()=>({ref:e})))}var Mn=T("table");function Ln(e){return e.replaceWith(Mn),Mn.replaceWith(dn(e)),j({ref:e})}function Ta(e){let t=q(":scope > input",e),r=t.find(o=>o.checked)||t[0];return _(...t.map(o=>h(o,"change").pipe(m(()=>W(`label[for="${o.id}"]`))))).pipe(V(W(`label[for="${r.id}"]`)),m(o=>({active:o})))}function _n(e,{viewport$:t}){let r=Dr("prev");e.append(r);let o=Dr("next");e.append(o);let n=W(".tabbed-labels",e);return H(()=>{let i=new x,s=i.pipe(Z(),re(!0));return B([i,ye(e)]).pipe(Ce(1,Oe),Y(s)).subscribe({next([{active:a},c]){let p=Je(a),{width:l}=he(a);e.style.setProperty("--md-indicator-x",`${p.x}px`),e.style.setProperty("--md-indicator-width",`${l}px`);let f=er(n);(p.xf.x+c.width)&&n.scrollTo({left:Math.max(0,p.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),B([dt(n),ye(n)]).pipe(Y(s)).subscribe(([a,c])=>{let p=bt(n);r.hidden=a.x<16,o.hidden=a.x>p.width-c.width-16}),_(h(r,"click").pipe(m(()=>-1)),h(o,"click").pipe(m(()=>1))).pipe(Y(s)).subscribe(a=>{let{width:c}=he(n);n.scrollBy({left:c*a,behavior:"smooth"})}),te("content.tabs.link")&&i.pipe(je(1),ne(t)).subscribe(([{active:a},{offset:c}])=>{let p=a.innerText.trim();if(a.hasAttribute("data-md-switching"))a.removeAttribute("data-md-switching");else{let l=e.offsetTop-c.y;for(let u of q("[data-tabs]"))for(let d of q(":scope > input",u)){let v=W(`label[for="${d.id}"]`);if(v!==a&&v.innerText.trim()===p){v.setAttribute("data-md-switching",""),d.click();break}}window.scrollTo({top:e.offsetTop-l});let f=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([p,...f])])}}),i.pipe(Y(s)).subscribe(()=>{for(let a of q("audio, video",e))a.pause()}),Ta(e).pipe(w(a=>i.next(a)),A(()=>i.complete()),m(a=>R({ref:e},a)))}).pipe(rt(ae))}function An(e,{viewport$:t,target$:r,print$:o}){return _(...q(".annotate:not(.highlight)",e).map(n=>gn(n,{target$:r,print$:o})),...q("pre:not(.mermaid) > code",e).map(n=>wn(n,{target$:r,print$:o})),...q("pre.mermaid",e).map(n=>On(n)),...q("table:not([class])",e).map(n=>Ln(n)),...q("details",e).map(n=>Sn(n,{target$:r,print$:o})),...q("[data-tabs]",e).map(n=>_n(n,{viewport$:t})))}function Oa(e,{alert$:t}){return t.pipe(E(r=>_(j(!0),j(!1).pipe(ze(2e3))).pipe(m(o=>({message:r,active:o})))))}function Cn(e,t){let r=W(".md-typeset",e);return H(()=>{let o=new x;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),Oa(e,t).pipe(w(n=>o.next(n)),A(()=>o.complete()),m(n=>R({ref:e},n)))})}function Ma({viewport$:e}){if(!te("header.autohide"))return j(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Le(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),X()),o=We("search");return B([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),X(),E(n=>n?r:j(!1)),V(!1))}function kn(e,t){return H(()=>B([ye(e),Ma(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),X((r,o)=>r.height===o.height&&r.hidden===o.hidden),J(1))}function Hn(e,{header$:t,main$:r}){return H(()=>{let o=new x,n=o.pipe(Z(),re(!0));return o.pipe(ee("active"),Ge(t)).subscribe(([{active:i},{hidden:s}])=>{e.classList.toggle("md-header--shadow",i&&!s),e.hidden=s}),r.subscribe(o),t.pipe(Y(n),m(i=>R({ref:e},i)))})}function La(e,{viewport$:t,header$:r}){return sr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=he(e);return{active:o>=n}}),ee("active"))}function $n(e,t){return H(()=>{let r=new x;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=ce(".md-content h1");return typeof o=="undefined"?L:La(o,t).pipe(w(n=>r.next(n)),A(()=>r.complete()),m(n=>R({ref:e},n)))})}function Rn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),X()),n=o.pipe(E(()=>ye(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),ee("bottom"))));return B([o,n,t]).pipe(m(([i,{top:s,bottom:a},{offset:{y:c},size:{height:p}}])=>(p=Math.max(0,p-Math.max(0,s-c,i)-Math.max(0,p+c-a)),{offset:s-i,height:p,active:s-i<=c})),X((i,s)=>i.offset===s.offset&&i.height===s.height&&i.active===s.active))}function _a(e){let t=__md_get("__palette")||{index:e.findIndex(r=>matchMedia(r.getAttribute("data-md-color-media")).matches)};return j(...e).pipe(se(r=>h(r,"change").pipe(m(()=>r))),V(e[Math.max(0,t.index)]),m(r=>({index:e.indexOf(r),color:{scheme:r.getAttribute("data-md-color-scheme"),primary:r.getAttribute("data-md-color-primary"),accent:r.getAttribute("data-md-color-accent")}})),J(1))}function Pn(e){let t=T("meta",{name:"theme-color"});document.head.appendChild(t);let r=T("meta",{name:"color-scheme"});return document.head.appendChild(r),H(()=>{let o=new x;o.subscribe(i=>{document.body.setAttribute("data-md-color-switching","");for(let[s,a]of Object.entries(i.color))document.body.setAttribute(`data-md-color-${s}`,a);for(let s=0;s{let i=Ee("header"),s=window.getComputedStyle(i);return r.content=s.colorScheme,s.backgroundColor.match(/\d+/g).map(a=>(+a).toString(16).padStart(2,"0")).join("")})).subscribe(i=>t.content=`#${i}`),o.pipe(Se(ae)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")});let n=q("input",e);return _a(n).pipe(w(i=>o.next(i)),A(()=>o.complete()),m(i=>R({ref:e},i)))})}function In(e,{progress$:t}){return H(()=>{let r=new x;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(w(o=>r.next({value:o})),A(()=>r.complete()),m(o=>({ref:e,value:o})))})}var Kr=Ht(zr());function Aa(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r}function Fn({alert$:e}){Kr.default.isSupported()&&new P(t=>{new Kr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||Aa(W(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(w(t=>{t.trigger.focus()}),m(()=>be("clipboard.copied"))).subscribe(e)}function Ca(e){if(e.length<2)return[""];let[t,r]=[...e].sort((n,i)=>n.length-i.length).map(n=>n.replace(/[^/]+$/,"")),o=0;if(t===r)o=t.length;else for(;t.charCodeAt(o)===r.charCodeAt(o);)o++;return e.map(n=>n.replace(t.slice(0,o),""))}function pr(e){let t=__md_get("__sitemap",sessionStorage,e);if(t)return j(t);{let r=me();return Zo(new URL("sitemap.xml",e||r.base)).pipe(m(o=>Ca(q("loc",o).map(n=>n.textContent))),de(()=>L),He([]),w(o=>__md_set("__sitemap",o,sessionStorage,e)))}}function jn(e){let t=W("[rel=canonical]",e);t.href=t.href.replace("//localhost:","//127.0.0.1");let r=new Map;for(let o of q(":scope > *",e)){let n=o.outerHTML;for(let i of["href","src"]){let s=o.getAttribute(i);if(s===null)continue;let a=new URL(s,t.href),c=o.cloneNode();c.setAttribute(i,`${a}`),n=c.outerHTML;break}r.set(n,o)}return r}function Wn({location$:e,viewport$:t,progress$:r}){let o=me();if(location.protocol==="file:")return L;let n=pr().pipe(m(l=>l.map(f=>`${new URL(f,o.base)}`))),i=h(document.body,"click").pipe(ne(n),E(([l,f])=>{if(!(l.target instanceof Element))return L;let u=l.target.closest("a");if(u===null)return L;if(u.target||l.metaKey||l.ctrlKey)return L;let d=new URL(u.href);return d.search=d.hash="",f.includes(`${d}`)?(l.preventDefault(),j(new URL(u.href))):L}),le());i.pipe(xe(1)).subscribe(()=>{let l=ce("link[rel=icon]");typeof l!="undefined"&&(l.href=l.href)}),h(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),i.pipe(ne(t)).subscribe(([l,{offset:f}])=>{history.scrollRestoration="manual",history.replaceState(f,""),history.pushState(null,"",l)}),i.subscribe(e);let s=e.pipe(V(pe()),ee("pathname"),je(1),E(l=>ar(l,{progress$:r}).pipe(de(()=>(ot(l,!0),L))))),a=new DOMParser,c=s.pipe(E(l=>l.text()),E(l=>{let f=a.parseFromString(l,"text/html");for(let b of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...te("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let z=ce(b),K=ce(b,f);typeof z!="undefined"&&typeof K!="undefined"&&z.replaceWith(K)}let u=jn(document.head),d=jn(f.head);for(let[b,z]of d)z.getAttribute("rel")==="stylesheet"||z.hasAttribute("src")||(u.has(b)?u.delete(b):document.head.appendChild(z));for(let b of u.values())b.getAttribute("rel")==="stylesheet"||b.hasAttribute("src")||b.remove();let v=Ee("container");return Fe(q("script",v)).pipe(E(b=>{let z=f.createElement("script");if(b.src){for(let K of b.getAttributeNames())z.setAttribute(K,b.getAttribute(K));return b.replaceWith(z),new P(K=>{z.onload=()=>K.complete()})}else return z.textContent=b.textContent,b.replaceWith(z),L}),Z(),re(f))}),le());return h(window,"popstate").pipe(m(pe)).subscribe(e),e.pipe(V(pe()),Le(2,1),M(([l,f])=>l.pathname===f.pathname&&l.hash!==f.hash),m(([,l])=>l)).subscribe(l=>{var f,u;history.state!==null||!l.hash?window.scrollTo(0,(u=(f=history.state)==null?void 0:f.y)!=null?u:0):(history.scrollRestoration="auto",ir(l.hash),history.scrollRestoration="manual")}),e.pipe(kr(i),V(pe()),Le(2,1),M(([l,f])=>l.pathname===f.pathname&&l.hash===f.hash),m(([,l])=>l)).subscribe(l=>{history.scrollRestoration="auto",ir(l.hash),history.scrollRestoration="manual",history.back()}),c.pipe(ne(e)).subscribe(([,l])=>{var f,u;history.state!==null||!l.hash?window.scrollTo(0,(u=(f=history.state)==null?void 0:f.y)!=null?u:0):ir(l.hash)}),t.pipe(ee("offset"),ke(100)).subscribe(({offset:l})=>{history.replaceState(l,"")}),c}var Dn=Ht(Nn());function Vn(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,s)=>`${i}${s}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return s=>(0,Dn.default)(s).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function Mt(e){return e.type===1}function lr(e){return e.type===3}function zn(e,t){let r=an(e);return _(j(location.protocol!=="file:"),We("search")).pipe($e(o=>o),E(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:te("search.suggest")}}})),r}function qn({document$:e}){let t=me(),r=Ue(new URL("../versions.json",t.base)).pipe(de(()=>L)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:s,aliases:a})=>s===i||a.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),E(n=>h(document.body,"click").pipe(M(i=>!i.metaKey&&!i.ctrlKey),ne(o),E(([i,s])=>{if(i.target instanceof Element){let a=i.target.closest("a");if(a&&!a.target&&n.has(a.href)){let c=a.href;return!i.target.closest(".md-version")&&n.get(c)===s?L:(i.preventDefault(),j(c))}}return L}),E(i=>{let{version:s}=n.get(i);return pr(new URL(i)).pipe(m(a=>{let p=pe().href.replace(t.base,"");return a.includes(p.split("#")[0])?new URL(`../${s}/${p}`,t.base):new URL(i)}))})))).subscribe(n=>ot(n,!0)),B([r,o]).subscribe(([n,i])=>{W(".md-header__topic").appendChild(hn(n,i))}),e.pipe(E(()=>o)).subscribe(n=>{var s;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let a=((s=t.version)==null?void 0:s.default)||"latest";Array.isArray(a)||(a=[a]);e:for(let c of a)for(let p of n.aliases)if(new RegExp(c,"i").test(p)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let a of oe("outdated"))a.hidden=!1})}function Pa(e,{worker$:t}){let{searchParams:r}=pe();r.has("q")&&(Ke("search",!0),e.value=r.get("q"),e.focus(),We("search").pipe($e(i=>!i)).subscribe(()=>{let i=pe();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=Zt(e),n=_(t.pipe($e(Mt)),h(e,"keyup"),o).pipe(m(()=>e.value),X());return B([n,o]).pipe(m(([i,s])=>({value:i,focus:s})),J(1))}function Kn(e,{worker$:t}){let r=new x,o=r.pipe(Z(),re(!0));B([t.pipe($e(Mt)),r],(i,s)=>s).pipe(ee("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(ee("focus")).subscribe(({focus:i})=>{i&&Ke("search",i)}),h(e.form,"reset").pipe(Y(o)).subscribe(()=>e.focus());let n=W("header [for=__search]");return h(n,"click").subscribe(()=>e.focus()),Pa(e,{worker$:t}).pipe(w(i=>r.next(i)),A(()=>r.complete()),m(i=>R({ref:e},i)),J(1))}function Qn(e,{worker$:t,query$:r}){let o=new x,n=Ko(e.parentElement).pipe(M(Boolean)),i=e.parentElement,s=W(":scope > :first-child",e),a=W(":scope > :last-child",e);We("search").subscribe(l=>a.setAttribute("role",l?"list":"presentation")),o.pipe(ne(r),Rr(t.pipe($e(Mt)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:s.textContent=f.length?be("search.result.none"):be("search.result.placeholder");break;case 1:s.textContent=be("search.result.one");break;default:let u=tr(l.length);s.textContent=be("search.result.other",u)}});let c=o.pipe(w(()=>a.innerHTML=""),E(({items:l})=>_(j(...l.slice(0,10)),j(...l.slice(10)).pipe(Le(4),Fr(n),E(([f])=>f)))),m(fn),le());return c.subscribe(l=>a.appendChild(l)),c.pipe(se(l=>{let f=ce("details",l);return typeof f=="undefined"?L:h(f,"toggle").pipe(Y(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(M(lr),m(({data:l})=>l)).pipe(w(l=>o.next(l)),A(()=>o.complete()),m(l=>R({ref:e},l)))}function Ia(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=pe();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function Yn(e,t){let r=new x,o=r.pipe(Z(),re(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),h(e,"click").pipe(Y(o)).subscribe(n=>n.preventDefault()),Ia(e,t).pipe(w(n=>r.next(n)),A(()=>r.complete()),m(n=>R({ref:e},n)))}function Bn(e,{worker$:t,keyboard$:r}){let o=new x,n=Ee("search-query"),i=_(h(n,"keydown"),h(n,"focus")).pipe(Se(ae),m(()=>n.value),X());return o.pipe(Ge(i),m(([{suggest:a},c])=>{let p=c.split(/([\s-]+)/);if(a!=null&&a.length&&p[p.length-1]){let l=a[a.length-1];l.startsWith(p[p.length-1])&&(p[p.length-1]=l)}else p.length=0;return p})).subscribe(a=>e.innerHTML=a.join("").replace(/\s/g," ")),r.pipe(M(({mode:a})=>a==="search")).subscribe(a=>{switch(a.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(M(lr),m(({data:a})=>a)).pipe(w(a=>o.next(a)),A(()=>o.complete()),m(()=>({ref:e})))}function Gn(e,{index$:t,keyboard$:r}){let o=me();try{let n=zn(o.search,t),i=Ee("search-query",e),s=Ee("search-result",e);h(e,"click").pipe(M(({target:c})=>c instanceof Element&&!!c.closest("a"))).subscribe(()=>Ke("search",!1)),r.pipe(M(({mode:c})=>c==="search")).subscribe(c=>{let p=Re();switch(c.type){case"Enter":if(p===i){let l=new Map;for(let f of q(":first-child [href]",s)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,d])=>d-u);f.click()}c.claim()}break;case"Escape":case"Tab":Ke("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof p=="undefined")i.focus();else{let l=[i,...q(":not(details) > [href], summary, details[open] [href]",s)],f=Math.max(0,(Math.max(0,l.indexOf(p))+l.length+(c.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}c.claim();break;default:i!==Re()&&i.focus()}}),r.pipe(M(({mode:c})=>c==="global")).subscribe(c=>{switch(c.type){case"f":case"s":case"/":i.focus(),i.select(),c.claim();break}});let a=Kn(i,{worker$:n});return _(a,Qn(s,{worker$:n,query$:a})).pipe(qe(...oe("search-share",e).map(c=>Yn(c,{query$:a})),...oe("search-suggest",e).map(c=>Bn(c,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Ve}}function Jn(e,{index$:t,location$:r}){return B([t,r.pipe(V(pe()),M(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>Vn(o.config)(n.searchParams.get("h"))),m(o=>{var s;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let a=i.nextNode();a;a=i.nextNode())if((s=a.parentElement)!=null&&s.offsetHeight){let c=a.textContent,p=o(c);p.length>c.length&&n.set(a,p)}for(let[a,c]of n){let{childNodes:p}=T("span",null,c);a.replaceWith(...Array.from(p))}return{ref:e,nodes:n}}))}function Fa(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return B([r,t]).pipe(m(([{offset:i,height:s},{offset:{y:a}}])=>(s=s+Math.min(n,Math.max(0,a-i))-n,{height:s,locked:a>=i+n})),X((i,s)=>i.height===s.height&&i.locked===s.locked))}function Qr(e,o){var n=o,{header$:t}=n,r=to(n,["header$"]);let i=W(".md-sidebar__scrollwrap",e),{y:s}=Je(i);return H(()=>{let a=new x,c=a.pipe(Z(),re(!0)),p=a.pipe(Ce(0,Oe));return p.pipe(ne(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*s}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),p.pipe($e()).subscribe(()=>{for(let l of q(".md-nav__link--active[href]",e)){let f=rr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=he(f);f.scrollTo({top:u-d/2})}}}),ge(q("label[tabindex]",e)).pipe(se(l=>h(l,"click").pipe(Se(ae),m(()=>l),Y(c)))).subscribe(l=>{let f=W(`[id="${l.htmlFor}"]`);W(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),Fa(e,r).pipe(w(l=>a.next(l)),A(()=>a.complete()),m(l=>R({ref:e},l)))})}function Xn(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return St(Ue(`${r}/releases/latest`).pipe(de(()=>L),m(o=>({version:o.tag_name})),He({})),Ue(r).pipe(de(()=>L),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),He({}))).pipe(m(([o,n])=>R(R({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return Ue(r).pipe(m(o=>({repositories:o.public_repos})),He({}))}}function Zn(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return Ue(r).pipe(de(()=>L),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),He({}))}function ei(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return Xn(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return Zn(r,o)}return L}var ja;function Wa(e){return ja||(ja=H(()=>{let t=__md_get("__source",sessionStorage);if(t)return j(t);if(oe("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return L}return ei(e.href).pipe(w(o=>__md_set("__source",o,sessionStorage)))}).pipe(de(()=>L),M(t=>Object.keys(t).length>0),m(t=>({facts:t})),J(1)))}function ti(e){let t=W(":scope > :last-child",e);return H(()=>{let r=new x;return r.subscribe(({facts:o})=>{t.appendChild(un(o)),t.classList.add("md-source__repository--active")}),Wa(e).pipe(w(o=>r.next(o)),A(()=>r.complete()),m(o=>R({ref:e},o)))})}function Ua(e,{viewport$:t,header$:r}){return ye(document.body).pipe(E(()=>sr(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),ee("hidden"))}function ri(e,t){return H(()=>{let r=new x;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(te("navigation.tabs.sticky")?j({hidden:!1}):Ua(e,t)).pipe(w(o=>r.next(o)),A(()=>r.complete()),m(o=>R({ref:e},o)))})}function Na(e,{viewport$:t,header$:r}){let o=new Map,n=q("[href^=\\#]",e);for(let a of n){let c=decodeURIComponent(a.hash.substring(1)),p=ce(`[id="${c}"]`);typeof p!="undefined"&&o.set(a,p)}let i=r.pipe(ee("height"),m(({height:a})=>{let c=Ee("main"),p=W(":scope > :first-child",c);return a+.8*(p.offsetTop-c.offsetTop)}),le());return ye(document.body).pipe(ee("height"),E(a=>H(()=>{let c=[];return j([...o].reduce((p,[l,f])=>{for(;c.length&&o.get(c[c.length-1]).tagName>=f.tagName;)c.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let d=f.offsetParent;for(;d;d=d.offsetParent)u+=d.offsetTop;return p.set([...c=[...c,l]].reverse(),u)},new Map))}).pipe(m(c=>new Map([...c].sort(([,p],[,l])=>p-l))),Ge(i),E(([c,p])=>t.pipe(Hr(([l,f],{offset:{y:u},size:d})=>{let v=u+d.height>=Math.floor(a.height);for(;f.length;){let[,b]=f[0];if(b-p=u&&!v)f=[l.pop(),...f];else break}return[l,f]},[[],[...c]]),X((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([a,c])=>({prev:a.map(([p])=>p),next:c.map(([p])=>p)})),V({prev:[],next:[]}),Le(2,1),m(([a,c])=>a.prev.length{let i=new x,s=i.pipe(Z(),re(!0));if(i.subscribe(({prev:a,next:c})=>{for(let[p]of c)p.classList.remove("md-nav__link--passed"),p.classList.remove("md-nav__link--active");for(let[p,[l]]of a.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",p===a.length-1)}),te("toc.follow")){let a=_(t.pipe(ke(1),m(()=>{})),t.pipe(ke(250),m(()=>"smooth")));i.pipe(M(({prev:c})=>c.length>0),Ge(o.pipe(Se(ae))),ne(a)).subscribe(([[{prev:c}],p])=>{let[l]=c[c.length-1];if(l.offsetHeight){let f=rr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=he(f);f.scrollTo({top:u-d/2,behavior:p})}}})}return te("navigation.tracking")&&t.pipe(Y(s),ee("offset"),ke(250),je(1),Y(n.pipe(je(1))),Tt({delay:250}),ne(i)).subscribe(([,{prev:a}])=>{let c=pe(),p=a[a.length-1];if(p&&p.length){let[l]=p,{hash:f}=new URL(l.href);c.hash!==f&&(c.hash=f,history.replaceState({},"",`${c}`))}else c.hash="",history.replaceState({},"",`${c}`)}),Na(e,{viewport$:t,header$:r}).pipe(w(a=>i.next(a)),A(()=>i.complete()),m(a=>R({ref:e},a)))})}function Da(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:s}})=>s),Le(2,1),m(([s,a])=>s>a&&a>0),X()),i=r.pipe(m(({active:s})=>s));return B([i,n]).pipe(m(([s,a])=>!(s&&a)),X(),Y(o.pipe(je(1))),re(!0),Tt({delay:250}),m(s=>({hidden:s})))}function ni(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new x,s=i.pipe(Z(),re(!0));return i.subscribe({next({hidden:a}){e.hidden=a,a?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(Y(s),ee("height")).subscribe(({height:a})=>{e.style.top=`${a+16}px`}),h(e,"click").subscribe(a=>{a.preventDefault(),window.scrollTo({top:0})}),Da(e,{viewport$:t,main$:o,target$:n}).pipe(w(a=>i.next(a)),A(()=>i.complete()),m(a=>R({ref:e},a)))}function ii({document$:e,tablet$:t}){e.pipe(E(()=>q(".md-toggle--indeterminate")),w(r=>{r.indeterminate=!0,r.checked=!1}),se(r=>h(r,"change").pipe(Pr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),ne(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function Va(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function ai({document$:e}){e.pipe(E(()=>q("[data-md-scrollfix]")),w(t=>t.removeAttribute("data-md-scrollfix")),M(Va),se(t=>h(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function si({viewport$:e,tablet$:t}){B([We("search"),t]).pipe(m(([r,o])=>r&&!o),E(r=>j(r).pipe(ze(r?400:100))),ne(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function za(){return location.protocol==="file:"?ht(`${new URL("search/search_index.js",Yr.base)}`).pipe(m(()=>__index),J(1)):Ue(new URL("search/search_index.json",Yr.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var nt=No(),_t=Bo(),gt=Jo(_t),Br=Yo(),Te=nn(),mr=jr("(min-width: 960px)"),pi=jr("(min-width: 1220px)"),li=Xo(),Yr=me(),mi=document.forms.namedItem("search")?za():Ve,Gr=new x;Fn({alert$:Gr});var Jr=new x;te("navigation.instant")&&Wn({location$:_t,viewport$:Te,progress$:Jr}).subscribe(nt);var ci;((ci=Yr.version)==null?void 0:ci.provider)==="mike"&&qn({document$:nt});_(_t,gt).pipe(ze(125)).subscribe(()=>{Ke("drawer",!1),Ke("search",!1)});Br.pipe(M(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=ce("link[rel=prev]");typeof t!="undefined"&&ot(t);break;case"n":case".":let r=ce("link[rel=next]");typeof r!="undefined"&&ot(r);break;case"Enter":let o=Re();o instanceof HTMLLabelElement&&o.click()}});ii({document$:nt,tablet$:mr});ai({document$:nt});si({viewport$:Te,tablet$:mr});var Xe=kn(Ee("header"),{viewport$:Te}),Lt=nt.pipe(m(()=>Ee("main")),E(e=>Rn(e,{viewport$:Te,header$:Xe})),J(1)),qa=_(...oe("consent").map(e=>cn(e,{target$:gt})),...oe("dialog").map(e=>Cn(e,{alert$:Gr})),...oe("header").map(e=>Hn(e,{viewport$:Te,header$:Xe,main$:Lt})),...oe("palette").map(e=>Pn(e)),...oe("progress").map(e=>In(e,{progress$:Jr})),...oe("search").map(e=>Gn(e,{index$:mi,keyboard$:Br})),...oe("source").map(e=>ti(e))),Ka=H(()=>_(...oe("announce").map(e=>sn(e)),...oe("content").map(e=>An(e,{viewport$:Te,target$:gt,print$:li})),...oe("content").map(e=>te("search.highlight")?Jn(e,{index$:mi,location$:_t}):L),...oe("header-title").map(e=>$n(e,{viewport$:Te,header$:Xe})),...oe("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Wr(pi,()=>Qr(e,{viewport$:Te,header$:Xe,main$:Lt})):Wr(mr,()=>Qr(e,{viewport$:Te,header$:Xe,main$:Lt}))),...oe("tabs").map(e=>ri(e,{viewport$:Te,header$:Xe})),...oe("toc").map(e=>oi(e,{viewport$:Te,header$:Xe,main$:Lt,target$:gt})),...oe("top").map(e=>ni(e,{viewport$:Te,header$:Xe,main$:Lt,target$:gt})))),fi=nt.pipe(E(()=>Ka),qe(qa),J(1));fi.subscribe();window.document$=nt;window.location$=_t;window.target$=gt;window.keyboard$=Br;window.viewport$=Te;window.tablet$=mr;window.screen$=pi;window.print$=li;window.alert$=Gr;window.progress$=Jr;window.component$=fi;})(); -//# sourceMappingURL=bundle.94c44541.min.js.map - diff --git a/site/assets/javascripts/bundle.94c44541.min.js.map b/site/assets/javascripts/bundle.94c44541.min.js.map deleted file mode 100644 index 72c8c72..0000000 --- a/site/assets/javascripts/bundle.94c44541.min.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/clipboard/dist/clipboard.js", "node_modules/escape-html/index.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/rxjs/node_modules/tslib/tslib.es6.js", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/EmptyError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/throwIfEmpty.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/first.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/sample.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/templates/assets/javascripts/browser/document/index.ts", "src/templates/assets/javascripts/browser/element/_/index.ts", "src/templates/assets/javascripts/browser/element/focus/index.ts", "src/templates/assets/javascripts/browser/element/offset/_/index.ts", "src/templates/assets/javascripts/browser/element/offset/content/index.ts", "src/templates/assets/javascripts/utilities/h/index.ts", "src/templates/assets/javascripts/utilities/round/index.ts", "src/templates/assets/javascripts/browser/script/index.ts", "src/templates/assets/javascripts/browser/element/size/_/index.ts", "src/templates/assets/javascripts/browser/element/size/content/index.ts", "src/templates/assets/javascripts/browser/element/visibility/index.ts", "src/templates/assets/javascripts/browser/toggle/index.ts", "src/templates/assets/javascripts/browser/keyboard/index.ts", "src/templates/assets/javascripts/browser/location/_/index.ts", "src/templates/assets/javascripts/browser/location/hash/index.ts", "src/templates/assets/javascripts/browser/media/index.ts", "src/templates/assets/javascripts/browser/request/index.ts", "src/templates/assets/javascripts/browser/viewport/offset/index.ts", "src/templates/assets/javascripts/browser/viewport/size/index.ts", "src/templates/assets/javascripts/browser/viewport/_/index.ts", "src/templates/assets/javascripts/browser/viewport/at/index.ts", "src/templates/assets/javascripts/browser/worker/index.ts", "src/templates/assets/javascripts/_/index.ts", "src/templates/assets/javascripts/components/_/index.ts", "src/templates/assets/javascripts/components/announce/index.ts", "src/templates/assets/javascripts/components/consent/index.ts", "src/templates/assets/javascripts/components/content/annotation/_/index.ts", "src/templates/assets/javascripts/templates/tooltip/index.tsx", "src/templates/assets/javascripts/templates/annotation/index.tsx", "src/templates/assets/javascripts/templates/clipboard/index.tsx", "src/templates/assets/javascripts/templates/search/index.tsx", "src/templates/assets/javascripts/templates/source/index.tsx", "src/templates/assets/javascripts/templates/tabbed/index.tsx", "src/templates/assets/javascripts/templates/table/index.tsx", "src/templates/assets/javascripts/templates/version/index.tsx", "src/templates/assets/javascripts/components/content/annotation/list/index.ts", "src/templates/assets/javascripts/components/content/annotation/block/index.ts", "src/templates/assets/javascripts/components/content/code/_/index.ts", "src/templates/assets/javascripts/components/content/details/index.ts", "src/templates/assets/javascripts/components/content/mermaid/index.css", "src/templates/assets/javascripts/components/content/mermaid/index.ts", "src/templates/assets/javascripts/components/content/table/index.ts", "src/templates/assets/javascripts/components/content/tabs/index.ts", "src/templates/assets/javascripts/components/content/_/index.ts", "src/templates/assets/javascripts/components/dialog/index.ts", "src/templates/assets/javascripts/components/header/_/index.ts", "src/templates/assets/javascripts/components/header/title/index.ts", "src/templates/assets/javascripts/components/main/index.ts", "src/templates/assets/javascripts/components/palette/index.ts", "src/templates/assets/javascripts/components/progress/index.ts", "src/templates/assets/javascripts/integrations/clipboard/index.ts", "src/templates/assets/javascripts/integrations/sitemap/index.ts", "src/templates/assets/javascripts/integrations/instant/index.ts", "src/templates/assets/javascripts/integrations/search/highlighter/index.ts", "src/templates/assets/javascripts/integrations/search/worker/message/index.ts", "src/templates/assets/javascripts/integrations/search/worker/_/index.ts", "src/templates/assets/javascripts/integrations/version/index.ts", "src/templates/assets/javascripts/components/search/query/index.ts", "src/templates/assets/javascripts/components/search/result/index.ts", "src/templates/assets/javascripts/components/search/share/index.ts", "src/templates/assets/javascripts/components/search/suggest/index.ts", "src/templates/assets/javascripts/components/search/_/index.ts", "src/templates/assets/javascripts/components/search/highlight/index.ts", "src/templates/assets/javascripts/components/sidebar/index.ts", "src/templates/assets/javascripts/components/source/facts/github/index.ts", "src/templates/assets/javascripts/components/source/facts/gitlab/index.ts", "src/templates/assets/javascripts/components/source/facts/_/index.ts", "src/templates/assets/javascripts/components/source/_/index.ts", "src/templates/assets/javascripts/components/tabs/index.ts", "src/templates/assets/javascripts/components/toc/index.ts", "src/templates/assets/javascripts/components/top/index.ts", "src/templates/assets/javascripts/patches/indeterminate/index.ts", "src/templates/assets/javascripts/patches/scrollfix/index.ts", "src/templates/assets/javascripts/patches/scrolllock/index.ts", "src/templates/assets/javascripts/polyfills/index.ts"], - "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*\n * Copyright (c) 2016-2023 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"focus-visible\"\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getActiveElement,\n getOptionalElement,\n requestJSON,\n setLocation,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchScript,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountProgress,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n setupClipboardJS,\n setupInstantNavigation,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Functions - @todo refactor\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch search index\n *\n * @returns Search index observable\n */\nfunction fetchSearchIndex(): Observable {\n if (location.protocol === \"file:\") {\n return watchScript(\n `${new URL(\"search/search_index.js\", config.base)}`\n )\n .pipe(\n // @ts-ignore - @todo fix typings\n map(() => __index),\n shareReplay(1)\n )\n } else {\n return requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget(location$)\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 960px)\")\nconst screen$ = watchMedia(\"(min-width: 1220px)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? fetchSearchIndex()\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up progress indicator */\nconst progress$ = new Subject()\n\n/* Set up instant navigation, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantNavigation({ location$, viewport$, progress$ })\n .subscribe(document$)\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"link[rel=prev]\")\n if (typeof prev !== \"undefined\")\n setLocation(prev)\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"link[rel=next]\")\n if (typeof next !== \"undefined\")\n setLocation(next)\n break\n\n /* Expand navigation, see https://bit.ly/3ZjG5io */\n case \"Enter\":\n const active = getActiveElement()\n if (active instanceof HTMLLabelElement)\n active.click()\n }\n })\n\n/* Set up patches */\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Progress bar */\n ...getComponentElements(\"progress\")\n .map(el => mountProgress(el, { progress$ })),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, {\n viewport$, header$, main$, target$\n })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.progress$ = progress$ /* Progress indicator subject */\nwindow.component$ = component$ /* Component observable */\n", "/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n", "/**\n * Returns true if the object is a function.\n * @param value The value to check\n */\nexport function isFunction(value: any): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n", "/**\n * Used to create Error subclasses until the community moves away from ES5.\n *\n * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors\n * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123\n *\n * @param createImpl A factory function to create the actual constructor implementation. The returned\n * function should be a named function that calls `_super` internally.\n */\nexport function createErrorClass(createImpl: (_super: any) => any): T {\n const _super = (instance: any) => {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n\n const ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (errors: any[]): UnsubscriptionError;\n}\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(\n (_super) =>\n function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {\n _super(this);\n this.message = errors\n ? `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}`\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n }\n);\n", "/**\n * Removes an item from an array, mutating it.\n * @param arr The array to remove the item from\n * @param item The item to remove\n */\nexport function arrRemove(arr: T[] | undefined | null, item: T) {\n if (arr) {\n const index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';\nimport { arrRemove } from './util/arrRemove';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nexport class Subscription implements SubscriptionLike {\n /** @nocollapse */\n public static EMPTY = (() => {\n const empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n */\n public closed = false;\n\n private _parentage: Subscription[] | Subscription | null = null;\n\n /**\n * The list of registered finalizers to execute upon unsubscription. Adding and removing from this\n * list occurs in the {@link #add} and {@link #remove} methods.\n */\n private _finalizers: Exclude[] | null = null;\n\n /**\n * @param initialTeardown A function executed first as part of the finalization\n * process that is kicked off when {@link #unsubscribe} is called.\n */\n constructor(private initialTeardown?: () => void) {}\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n * @return {void}\n */\n unsubscribe(): void {\n let errors: any[] | undefined;\n\n if (!this.closed) {\n this.closed = true;\n\n // Remove this from it's parents.\n const { _parentage } = this;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n for (const parent of _parentage) {\n parent.remove(this);\n }\n } else {\n _parentage.remove(this);\n }\n }\n\n const { initialTeardown: initialFinalizer } = this;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n\n const { _finalizers } = this;\n if (_finalizers) {\n this._finalizers = null;\n for (const finalizer of _finalizers) {\n try {\n execFinalizer(finalizer);\n } catch (err) {\n errors = errors ?? [];\n if (err instanceof UnsubscriptionError) {\n errors = [...errors, ...err.errors];\n } else {\n errors.push(err);\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n }\n\n /**\n * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called\n * when this subscription is unsubscribed. If this subscription is already {@link #closed},\n * because it has already been unsubscribed, then whatever finalizer is passed to it\n * will automatically be executed (unless the finalizer itself is also a closed subscription).\n *\n * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed\n * subscription to a any subscription will result in no operation. (A noop).\n *\n * Adding a subscription to itself, or adding `null` or `undefined` will not perform any\n * operation at all. (A noop).\n *\n * `Subscription` instances that are added to this instance will automatically remove themselves\n * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove\n * will need to be removed manually with {@link #remove}\n *\n * @param teardown The finalization logic to add to this subscription.\n */\n add(teardown: TeardownLogic): void {\n // Only add the finalizer if it's not undefined\n // and don't add a subscription to itself.\n if (teardown && teardown !== this) {\n if (this.closed) {\n // If this subscription is already closed,\n // execute whatever finalizer is handed to it automatically.\n execFinalizer(teardown);\n } else {\n if (teardown instanceof Subscription) {\n // We don't add closed subscriptions, and we don't add the same subscription\n // twice. Subscription unsubscribe is idempotent.\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = this._finalizers ?? []).push(teardown);\n }\n }\n }\n\n /**\n * Checks to see if a this subscription already has a particular parent.\n * This will signal that this subscription has already been added to the parent in question.\n * @param parent the parent to check for\n */\n private _hasParent(parent: Subscription) {\n const { _parentage } = this;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n }\n\n /**\n * Adds a parent to this subscription so it can be removed from the parent if it\n * unsubscribes on it's own.\n *\n * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.\n * @param parent The parent subscription to add\n */\n private _addParent(parent: Subscription) {\n const { _parentage } = this;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n }\n\n /**\n * Called on a child when it is removed via {@link #remove}.\n * @param parent The parent to remove\n */\n private _removeParent(parent: Subscription) {\n const { _parentage } = this;\n if (_parentage === parent) {\n this._parentage = null;\n } else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n }\n\n /**\n * Removes a finalizer from this subscription that was previously added with the {@link #add} method.\n *\n * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves\n * from every other `Subscription` they have been added to. This means that using the `remove` method\n * is not a common thing and should be used thoughtfully.\n *\n * If you add the same finalizer instance of a function or an unsubscribable object to a `Subscription` instance\n * more than once, you will need to call `remove` the same number of times to remove all instances.\n *\n * All finalizer instances are removed to free up memory upon unsubscription.\n *\n * @param teardown The finalizer to remove from this subscription\n */\n remove(teardown: Exclude): void {\n const { _finalizers } = this;\n _finalizers && arrRemove(_finalizers, teardown);\n\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n }\n}\n\nexport const EMPTY_SUBSCRIPTION = Subscription.EMPTY;\n\nexport function isSubscription(value: any): value is Subscription {\n return (\n value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))\n );\n}\n\nfunction execFinalizer(finalizer: Unsubscribable | (() => void)) {\n if (isFunction(finalizer)) {\n finalizer();\n } else {\n finalizer.unsubscribe();\n }\n}\n", "import { Subscriber } from './Subscriber';\nimport { ObservableNotification } from './types';\n\n/**\n * The {@link GlobalConfig} object for RxJS. It is used to configure things\n * like how to react on unhandled errors.\n */\nexport const config: GlobalConfig = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like how to react on unhandled errors. Accessible via {@link config}\n * object.\n */\nexport interface GlobalConfig {\n /**\n * A registration point for unhandled errors from RxJS. These are errors that\n * cannot were not handled by consuming code in the usual subscription path. For\n * example, if you have this configured, and you subscribe to an observable without\n * providing an error handler, errors from that subscription will end up here. This\n * will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onUnhandledError: ((err: any) => void) | null;\n\n /**\n * A registration point for notifications that cannot be sent to subscribers because they\n * have completed, errored or have been explicitly unsubscribed. By default, next, complete\n * and error notifications sent to stopped subscribers are noops. However, sometimes callers\n * might want a different behavior. For example, with sources that attempt to report errors\n * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.\n * This will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onStoppedNotification: ((notification: ObservableNotification, subscriber: Subscriber) => void) | null;\n\n /**\n * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}\n * methods.\n *\n * @deprecated As of version 8, RxJS will no longer support this sort of injection of a\n * Promise constructor. If you need a Promise implementation other than native promises,\n * please polyfill/patch Promise as you see appropriate. Will be removed in v8.\n */\n Promise?: PromiseConstructorLike;\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME\n * FOR MIGRATION REASONS.\n *\n * @deprecated As of version 8, RxJS will no longer support synchronous throwing\n * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad\n * behaviors described above. Will be removed in v8.\n */\n useDeprecatedSynchronousErrorHandling: boolean;\n\n /**\n * If true, enables an as-of-yet undocumented feature from v5: The ability to access\n * `unsubscribe()` via `this` context in `next` functions created in observers passed\n * to `subscribe`.\n *\n * This is being removed because the performance was severely problematic, and it could also cause\n * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have\n * their `this` context overwritten.\n *\n * @deprecated As of version 8, RxJS will no longer support altering the\n * context of next functions provided as part of an observer to Subscribe. Instead,\n * you will have access to a subscription or a signal or token that will allow you to do things like\n * unsubscribe and test closed status. Will be removed in v8.\n */\n useDeprecatedNextContext: boolean;\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearTimeoutFunction = (handle: TimerHandle) => void;\n\ninterface TimeoutProvider {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n delegate:\n | {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n }\n | undefined;\n}\n\nexport const timeoutProvider: TimeoutProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setTimeout(handler: () => void, timeout?: number, ...args) {\n const { delegate } = timeoutProvider;\n if (delegate?.setTimeout) {\n return delegate.setTimeout(handler, timeout, ...args);\n }\n return setTimeout(handler, timeout, ...args);\n },\n clearTimeout(handle) {\n const { delegate } = timeoutProvider;\n return (delegate?.clearTimeout || clearTimeout)(handle as any);\n },\n delegate: undefined,\n};\n", "import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\n\n/**\n * Handles an error on another job either with the user-configured {@link onUnhandledError},\n * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.\n *\n * This should be called whenever there is an error that is out-of-band with the subscription\n * or when an error hits a terminal boundary of the subscription and no error handler was provided.\n *\n * @param err the error to report\n */\nexport function reportUnhandledError(err: any) {\n timeoutProvider.setTimeout(() => {\n const { onUnhandledError } = config;\n if (onUnhandledError) {\n // Execute the user-configured error handler.\n onUnhandledError(err);\n } else {\n // Throw so it is picked up by the runtime's uncaught error mechanism.\n throw err;\n }\n });\n}\n", "/* tslint:disable:no-empty */\nexport function noop() { }\n", "import { CompleteNotification, NextNotification, ErrorNotification } from './types';\n\n/**\n * A completion object optimized for memory use and created to be the\n * same \"shape\" as other notifications in v8.\n * @internal\n */\nexport const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();\n\n/**\n * Internal use only. Creates an optimized error notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function errorNotification(error: any): ErrorNotification {\n return createNotification('E', undefined, error) as any;\n}\n\n/**\n * Internal use only. Creates an optimized next notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function nextNotification(value: T) {\n return createNotification('N', value, undefined) as NextNotification;\n}\n\n/**\n * Ensures that all notifications created internally have the same \"shape\" in v8.\n *\n * TODO: This is only exported to support a crazy legacy test in `groupBy`.\n * @internal\n */\nexport function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {\n return {\n kind,\n value,\n error,\n };\n}\n", "import { config } from '../config';\n\nlet context: { errorThrown: boolean; error: any } | null = null;\n\n/**\n * Handles dealing with errors for super-gross mode. Creates a context, in which\n * any synchronously thrown errors will be passed to {@link captureError}. Which\n * will record the error such that it will be rethrown after the call back is complete.\n * TODO: Remove in v8\n * @param cb An immediately executed function.\n */\nexport function errorContext(cb: () => void) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n const isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n const { errorThrown, error } = context!;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n } else {\n // This is the general non-deprecated path for everyone that\n // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)\n cb();\n }\n}\n\n/**\n * Captures errors only in super-gross mode.\n * @param err the error to capture\n */\nexport function captureError(err: any) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { Observer, ObservableNotification } from './types';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber\n */\nexport class Subscriber extends Subscription implements Observer {\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param next The `next` callback of an Observer.\n * @param error The `error` callback of an\n * Observer.\n * @param complete The `complete` callback of an\n * Observer.\n * @return A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @nocollapse\n * @deprecated Do not use. Will be removed in v8. There is no replacement for this\n * method, and there is no reason to be creating instances of `Subscriber` directly.\n * If you have a specific use case, please file an issue.\n */\n static create(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber {\n return new SafeSubscriber(next, error, complete);\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected isStopped: boolean = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected destination: Subscriber | Observer; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.\n */\n constructor(destination?: Subscriber | Observer) {\n super();\n if (destination) {\n this.destination = destination;\n // Automatically chain subscriptions together here.\n // if destination is a Subscription, then it is a Subscriber.\n if (isSubscription(destination)) {\n destination.add(this);\n }\n } else {\n this.destination = EMPTY_OBSERVER;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param {T} [value] The `next` value.\n * @return {void}\n */\n next(value?: T): void {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n } else {\n this._next(value!);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param {any} [err] The `error` exception.\n * @return {void}\n */\n error(err?: any): void {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n } else {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n * @return {void}\n */\n complete(): void {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n } else {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (!this.closed) {\n this.isStopped = true;\n super.unsubscribe();\n this.destination = null!;\n }\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n try {\n this.destination.error(err);\n } finally {\n this.unsubscribe();\n }\n }\n\n protected _complete(): void {\n try {\n this.destination.complete();\n } finally {\n this.unsubscribe();\n }\n }\n}\n\n/**\n * This bind is captured here because we want to be able to have\n * compatibility with monoid libraries that tend to use a method named\n * `bind`. In particular, a library called Monio requires this.\n */\nconst _bind = Function.prototype.bind;\n\nfunction bind any>(fn: Fn, thisArg: any): Fn {\n return _bind.call(fn, thisArg);\n}\n\n/**\n * Internal optimization only, DO NOT EXPOSE.\n * @internal\n */\nclass ConsumerObserver implements Observer {\n constructor(private partialObserver: Partial>) {}\n\n next(value: T): void {\n const { partialObserver } = this;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n\n error(err: any): void {\n const { partialObserver } = this;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n } catch (error) {\n handleUnhandledError(error);\n }\n } else {\n handleUnhandledError(err);\n }\n }\n\n complete(): void {\n const { partialObserver } = this;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n}\n\nexport class SafeSubscriber extends Subscriber {\n constructor(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((e?: any) => void) | null,\n complete?: (() => void) | null\n ) {\n super();\n\n let partialObserver: Partial>;\n if (isFunction(observerOrNext) || !observerOrNext) {\n // The first argument is a function, not an observer. The next\n // two arguments *could* be observers, or they could be empty.\n partialObserver = {\n next: (observerOrNext ?? undefined) as (((value: T) => void) | undefined),\n error: error ?? undefined,\n complete: complete ?? undefined,\n };\n } else {\n // The first argument is a partial observer.\n let context: any;\n if (this && config.useDeprecatedNextContext) {\n // This is a deprecated path that made `this.unsubscribe()` available in\n // next handler functions passed to subscribe. This only exists behind a flag\n // now, as it is *very* slow.\n context = Object.create(observerOrNext);\n context.unsubscribe = () => this.unsubscribe();\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context),\n error: observerOrNext.error && bind(observerOrNext.error, context),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context),\n };\n } else {\n // The \"normal\" path. Just use the partial observer directly.\n partialObserver = observerOrNext;\n }\n }\n\n // Wrap the partial observer to ensure it's a full observer, and\n // make sure proper error handling is accounted for.\n this.destination = new ConsumerObserver(partialObserver);\n }\n}\n\nfunction handleUnhandledError(error: any) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n } else {\n // Ideal path, we report this as an unhandled error,\n // which is thrown on a new call stack.\n reportUnhandledError(error);\n }\n}\n\n/**\n * An error handler used when no error handler was supplied\n * to the SafeSubscriber -- meaning no error handler was supplied\n * do the `subscribe` call on our observable.\n * @param err The error to handle\n */\nfunction defaultErrorHandler(err: any) {\n throw err;\n}\n\n/**\n * A handler for notifications that cannot be sent to a stopped subscriber.\n * @param notification The notification being sent\n * @param subscriber The stopped subscriber\n */\nfunction handleStoppedNotification(notification: ObservableNotification, subscriber: Subscriber) {\n const { onStoppedNotification } = config;\n onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));\n}\n\n/**\n * The observer used as a stub for subscriptions where the user did not\n * pass any arguments to `subscribe`. Comes with the default error handling\n * behavior.\n */\nexport const EMPTY_OBSERVER: Readonly> & { closed: true } = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n", "/**\n * Symbol.observable or a string \"@@observable\". Used for interop\n *\n * @deprecated We will no longer be exporting this symbol in upcoming versions of RxJS.\n * Instead polyfill and use Symbol.observable directly *or* use https://www.npmjs.com/package/symbol-observable\n */\nexport const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();\n", "/**\n * This function takes one parameter and just returns it. Simply put,\n * this is like `(x: T): T => x`.\n *\n * ## Examples\n *\n * This is useful in some cases when using things like `mergeMap`\n *\n * ```ts\n * import { interval, take, map, range, mergeMap, identity } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(5));\n *\n * const result$ = source$.pipe(\n * map(i => range(i)),\n * mergeMap(identity) // same as mergeMap(x => x)\n * );\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * Or when you want to selectively apply an operator\n *\n * ```ts\n * import { interval, take, identity } from 'rxjs';\n *\n * const shouldLimit = () => Math.random() < 0.5;\n *\n * const source$ = interval(1000);\n *\n * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * @param x Any value that is returned by this function\n * @returns The value passed as the first parameter to this function\n */\nexport function identity(x: T): T {\n return x;\n}\n", "import { identity } from './identity';\nimport { UnaryFunction } from '../types';\n\nexport function pipe(): typeof identity;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction,\n ...fns: UnaryFunction[]\n): UnaryFunction;\n\n/**\n * pipe() can be called on one or more functions, each of which can take one argument (\"UnaryFunction\")\n * and uses it to return a value.\n * It returns a function that takes one argument, passes it to the first UnaryFunction, and then\n * passes the result to the next one, passes that result to the next one, and so on. \n */\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (fns.length === 0) {\n return identity as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n", "import { Operator } from './Operator';\nimport { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription, Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n *\n * @class Observable\n */\nexport class Observable implements Subscribable {\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n source: Observable | undefined;\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n operator: Operator | undefined;\n\n /**\n * @constructor\n * @param {Function} subscribe the function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new Observable by calling the Observable constructor\n * @owner Observable\n * @method create\n * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n * @return {Observable} a new observable\n * @nocollapse\n * @deprecated Use `new Observable()` instead. Will be removed in v8.\n */\n static create: (...args: any[]) => any = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n };\n\n /**\n * Creates a new Observable, with this Observable instance as the source, and the passed\n * operator defined as the new observable's operator.\n * @method lift\n * @param operator the operator defining the operation to take on the observable\n * @return a new observable with the Operator applied\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * If you have implemented an operator using `lift`, it is recommended that you create an\n * operator by simply returning `new Observable()` directly. See \"Creating new operators from\n * scratch\" section here: https://rxjs.dev/guide/operators\n */\n lift(operator?: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observerOrNext?: Partial> | ((value: T) => void)): Subscription;\n /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */\n subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,\n * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,\n * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or\n * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide\n * an `error` method to avoid missing thrown errors.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,\n * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.\n *\n * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events\n * and you also handled emissions internally by using operators (e.g. using `tap`).\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * #### Examples\n *\n * Subscribe with an {@link guide/observer Observer}\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})\n *\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Cancel a subscription\n *\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe({\n * next(num) {\n * console.log(num)\n * },\n * complete() {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * });\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 'unsubscribed!' after 2.5s\n * ```\n *\n * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n * or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n * Observable.\n * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown asynchronously as unhandled.\n * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n * @return {Subscription} a subscription reference to the registered handlers\n * @method subscribe\n */\n subscribe(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((error: any) => void) | null,\n complete?: (() => void) | null\n ): Subscription {\n const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n\n errorContext(() => {\n const { operator, source } = this;\n subscriber.add(\n operator\n ? // We're dealing with a subscription in the\n // operator chain to one of our lifted operators.\n operator.call(subscriber, source)\n : source\n ? // If `source` has a value, but `operator` does not, something that\n // had intimate knowledge of our API, like our `Subject`, must have\n // set it. We're going to just call `_subscribe` directly.\n this._subscribe(subscriber)\n : // In all other cases, we're likely wrapping a user-provided initializer\n // function, so we need to catch errors and handle them appropriately.\n this._trySubscribe(subscriber)\n );\n });\n\n return subscriber;\n }\n\n /** @internal */\n protected _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n // We don't need to return anything in this case,\n // because it's just going to try to `add()` to a subscription\n // above.\n sink.error(err);\n }\n }\n\n /**\n * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with\n * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * #### Example\n *\n * ```ts\n * import { interval, take } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(4));\n *\n * async function getTotal() {\n * let total = 0;\n *\n * await source$.forEach(value => {\n * total += value;\n * console.log('observable -> ' + value);\n * });\n *\n * return total;\n * }\n *\n * getTotal().then(\n * total => console.log('Total: ' + total)\n * );\n *\n * // Expected:\n * // 'observable -> 0'\n * // 'observable -> 1'\n * // 'observable -> 2'\n * // 'observable -> 3'\n * // 'Total: 6'\n * ```\n *\n * @param next a handler for each value emitted by the observable\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n */\n forEach(next: (value: T) => void): Promise;\n\n /**\n * @param next a handler for each value emitted by the observable\n * @param promiseCtor a constructor function used to instantiate the Promise\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n * @deprecated Passing a Promise constructor will no longer be available\n * in upcoming versions of RxJS. This is because it adds weight to the library, for very\n * little benefit. If you need this functionality, it is recommended that you either\n * polyfill Promise, or you create an adapter to convert the returned native promise\n * to whatever promise implementation you wanted. Will be removed in v8.\n */\n forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise;\n\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n const subscriber = new SafeSubscriber({\n next: (value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n this.subscribe(subscriber);\n }) as Promise;\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): TeardownLogic {\n return this.source?.subscribe(subscriber);\n }\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @method Symbol.observable\n * @return {Observable} this instance of the observable\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction,\n ...operations: OperatorFunction[]\n ): Observable;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n * @method pipe\n * @return {Observable} the Observable result of all of the operators having\n * been called in the order they were passed in.\n *\n * ## Example\n *\n * ```ts\n * import { interval, filter, map, scan } from 'rxjs';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x));\n * ```\n */\n pipe(...operations: OperatorFunction[]): Observable {\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: typeof Promise): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n /**\n * Subscribe to this Observable and get a Promise resolving on\n * `complete` with the last emission (if any).\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * @method toPromise\n * @param [promiseCtor] a constructor function used to instantiate\n * the Promise\n * @return A Promise that resolves with the last value emit, or\n * rejects on an error. If there were no emissions, Promise\n * resolves with undefined.\n * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise\n */\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: T | undefined;\n this.subscribe(\n (x: T) => (value = x),\n (err: any) => reject(err),\n () => resolve(value)\n );\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n return promiseCtor ?? config.Promise ?? Promise;\n}\n\nfunction isObserver(value: any): value is Observer {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\n\nfunction isSubscriber(value: any): value is Subscriber {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n", "import { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { OperatorFunction } from '../types';\nimport { isFunction } from './isFunction';\n\n/**\n * Used to determine if an object is an Observable with a lift function.\n */\nexport function hasLift(source: any): source is { lift: InstanceType['lift'] } {\n return isFunction(source?.lift);\n}\n\n/**\n * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.\n * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.\n */\nexport function operate(\n init: (liftedSource: Observable, subscriber: Subscriber) => (() => void) | void\n): OperatorFunction {\n return (source: Observable) => {\n if (hasLift(source)) {\n return source.lift(function (this: Subscriber, liftedSource: Observable) {\n try {\n return init(liftedSource, this);\n } catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n", "import { Subscriber } from '../Subscriber';\n\n/**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional teardown logic here. This will only be called on teardown if the\n * subscriber itself is not already closed. This is called after all other teardown logic is executed.\n */\nexport function createOperatorSubscriber(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n onFinalize?: () => void\n): Subscriber {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\n\n/**\n * A generic helper for allowing operators to be created with a Subscriber and\n * use closures to capture necessary state from the operator function itself.\n */\nexport class OperatorSubscriber extends Subscriber {\n /**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional finalization logic here. This will only be called on finalization if the\n * subscriber itself is not already closed. This is called after all other finalization logic is executed.\n * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.\n * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription\n * to the resulting observable does not actually disconnect from the source if there are active subscriptions\n * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)\n */\n constructor(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n private onFinalize?: () => void,\n private shouldUnsubscribe?: () => boolean\n ) {\n // It's important - for performance reasons - that all of this class's\n // members are initialized and that they are always initialized in the same\n // order. This will ensure that all OperatorSubscriber instances have the\n // same hidden class in V8. This, in turn, will help keep the number of\n // hidden classes involved in property accesses within the base class as\n // low as possible. If the number of hidden classes involved exceeds four,\n // the property accesses will become megamorphic and performance penalties\n // will be incurred - i.e. inline caches won't be used.\n //\n // The reasons for ensuring all instances have the same hidden class are\n // further discussed in this blog post from Benedikt Meurer:\n // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/\n super(destination);\n this._next = onNext\n ? function (this: OperatorSubscriber, value: T) {\n try {\n onNext(value);\n } catch (err) {\n destination.error(err);\n }\n }\n : super._next;\n this._error = onError\n ? function (this: OperatorSubscriber, err: any) {\n try {\n onError(err);\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._error;\n this._complete = onComplete\n ? function (this: OperatorSubscriber) {\n try {\n onComplete();\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._complete;\n }\n\n unsubscribe() {\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n const { closed } = this;\n super.unsubscribe();\n // Execute additional teardown if we have any and we didn't already do so.\n !closed && this.onFinalize?.();\n }\n }\n}\n", "import { Subscription } from '../Subscription';\n\ninterface AnimationFrameProvider {\n schedule(callback: FrameRequestCallback): Subscription;\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n delegate:\n | {\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n }\n | undefined;\n}\n\nexport const animationFrameProvider: AnimationFrameProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n schedule(callback) {\n let request = requestAnimationFrame;\n let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;\n const { delegate } = animationFrameProvider;\n if (delegate) {\n request = delegate.requestAnimationFrame;\n cancel = delegate.cancelAnimationFrame;\n }\n const handle = request((timestamp) => {\n // Clear the cancel function. The request has been fulfilled, so\n // attempting to cancel the request upon unsubscription would be\n // pointless.\n cancel = undefined;\n callback(timestamp);\n });\n return new Subscription(() => cancel?.(handle));\n },\n requestAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);\n },\n cancelAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);\n },\n delegate: undefined,\n};\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface ObjectUnsubscribedError extends Error {}\n\nexport interface ObjectUnsubscribedErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (): ObjectUnsubscribedError;\n}\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = createErrorClass(\n (_super) =>\n function ObjectUnsubscribedErrorImpl(this: any) {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n }\n);\n", "import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n */\nexport class Subject extends Observable implements SubscriptionLike {\n closed = false;\n\n private currentObservers: Observer[] | null = null;\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n observers: Observer[] = [];\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n isStopped = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n hasError = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n thrownError: any = null;\n\n /**\n * Creates a \"subject\" by basically gluing an observer to an observable.\n *\n * @nocollapse\n * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.\n */\n static create: (...args: any[]) => any = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n };\n\n constructor() {\n // NOTE: This must be here to obscure Observable's constructor.\n super();\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator as any;\n return subject as any;\n }\n\n /** @internal */\n protected _throwIfClosed() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n }\n\n next(value: T) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n if (!this.currentObservers) {\n this.currentObservers = Array.from(this.observers);\n }\n for (const observer of this.currentObservers) {\n observer.next(value);\n }\n }\n });\n }\n\n error(err: any) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.hasError = this.isStopped = true;\n this.thrownError = err;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.error(err);\n }\n }\n });\n }\n\n complete() {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.isStopped = true;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.complete();\n }\n }\n });\n }\n\n unsubscribe() {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null!;\n }\n\n get observed() {\n return this.observers?.length > 0;\n }\n\n /** @internal */\n protected _trySubscribe(subscriber: Subscriber): TeardownLogic {\n this._throwIfClosed();\n return super._trySubscribe(subscriber);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n }\n\n /** @internal */\n protected _innerSubscribe(subscriber: Subscriber) {\n const { hasError, isStopped, observers } = this;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(() => {\n this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n }\n\n /** @internal */\n protected _checkFinalizedStatuses(subscriber: Subscriber) {\n const { hasError, thrownError, isStopped } = this;\n if (hasError) {\n subscriber.error(thrownError);\n } else if (isStopped) {\n subscriber.complete();\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create custom Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return {Observable} Observable that the Subject casts to\n */\n asObservable(): Observable {\n const observable: any = new Observable();\n observable.source = this;\n return observable;\n }\n}\n\n/**\n * @class AnonymousSubject\n */\nexport class AnonymousSubject extends Subject {\n constructor(\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n public destination?: Observer,\n source?: Observable\n ) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n this.destination?.next?.(value);\n }\n\n error(err: any) {\n this.destination?.error?.(err);\n }\n\n complete() {\n this.destination?.complete?.();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;\n }\n}\n", "import { TimestampProvider } from '../types';\n\ninterface DateTimestampProvider extends TimestampProvider {\n delegate: TimestampProvider | undefined;\n}\n\nexport const dateTimestampProvider: DateTimestampProvider = {\n now() {\n // Use the variable rather than `this` so that the function can be called\n // without being bound to the provider.\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n", "import { Subject } from './Subject';\nimport { TimestampProvider } from './types';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * A variant of {@link Subject} that \"replays\" old values to new subscribers by emitting them when they first subscribe.\n *\n * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,\n * `ReplaySubject` \"observes\" values by having them passed to its `next` method. When it observes a value, it will store that\n * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.\n *\n * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in\n * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will\n * error if it has observed an error.\n *\n * There are two main configuration items to be concerned with:\n *\n * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.\n * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.\n *\n * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values\n * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.\n *\n * ### Differences with BehaviorSubject\n *\n * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple of exceptions:\n *\n * 1. `BehaviorSubject` comes \"primed\" with a single value upon construction.\n * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n * @see {@link shareReplay}\n */\nexport class ReplaySubject extends Subject {\n private _buffer: (T | number)[] = [];\n private _infiniteTimeWindow = true;\n\n /**\n * @param bufferSize The size of the buffer to replay on subscription\n * @param windowTime The amount of time the buffered items will stay buffered\n * @param timestampProvider An object with a `now()` method that provides the current timestamp. This is used to\n * calculate the amount of time something has been buffered.\n */\n constructor(\n private _bufferSize = Infinity,\n private _windowTime = Infinity,\n private _timestampProvider: TimestampProvider = dateTimestampProvider\n ) {\n super();\n this._infiniteTimeWindow = _windowTime === Infinity;\n this._bufferSize = Math.max(1, _bufferSize);\n this._windowTime = Math.max(1, _windowTime);\n }\n\n next(value: T): void {\n const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;\n if (!isStopped) {\n _buffer.push(value);\n !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);\n }\n this._trimBuffer();\n super.next(value);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._trimBuffer();\n\n const subscription = this._innerSubscribe(subscriber);\n\n const { _infiniteTimeWindow, _buffer } = this;\n // We use a copy here, so reentrant code does not mutate our array while we're\n // emitting it to a new subscriber.\n const copy = _buffer.slice();\n for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {\n subscriber.next(copy[i] as T);\n }\n\n this._checkFinalizedStatuses(subscriber);\n\n return subscription;\n }\n\n private _trimBuffer() {\n const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;\n // If we don't have an infinite buffer size, and we're over the length,\n // use splice to truncate the old buffer values off. Note that we have to\n // double the size for instances where we're not using an infinite time window\n // because we're storing the values and the timestamps in the same array.\n const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;\n _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);\n\n // Now, if we're not in an infinite time window, remove all values where the time is\n // older than what is allowed.\n if (!_infiniteTimeWindow) {\n const now = _timestampProvider.now();\n let last = 0;\n // Search the array for the first timestamp that isn't expired and\n // truncate the buffer up to that point.\n for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {\n last = i;\n }\n last && _buffer.splice(0, last + 1);\n }\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\nimport { SchedulerAction } from '../types';\n\n/**\n * A unit of work to be executed in a `scheduler`. An action is typically\n * created from within a {@link SchedulerLike} and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: SchedulerAction, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler.\n * @return {void}\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearIntervalFunction = (handle: TimerHandle) => void;\n\ninterface IntervalProvider {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n delegate:\n | {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n }\n | undefined;\n}\n\nexport const intervalProvider: IntervalProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setInterval(handler: () => void, timeout?: number, ...args) {\n const { delegate } = intervalProvider;\n if (delegate?.setInterval) {\n return delegate.setInterval(handler, timeout, ...args);\n }\n return setInterval(handler, timeout, ...args);\n },\n clearInterval(handle) {\n const { delegate } = intervalProvider;\n return (delegate?.clearInterval || clearInterval)(handle as any);\n },\n delegate: undefined,\n};\n", "import { Action } from './Action';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncAction extends Action {\n public id: TimerHandle | undefined;\n public state?: T;\n // @ts-ignore: Property has no initializer and is not definitely assigned\n public delay: number;\n protected pending: boolean = false;\n\n constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id ?? this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, _id?: TimerHandle, delay: number = 0): TimerHandle {\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(_scheduler: AsyncScheduler, id?: TimerHandle, delay: number | null = 0): TimerHandle | undefined {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n\n return undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n * @return {any}\n */\n public execute(state: T, delay: number): any {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, _delay: number): any {\n let errored: boolean = false;\n let errorValue: any;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n // HACK: Since code elsewhere is relying on the \"truthiness\" of the\n // return here, we can't have it return \"\" or 0 or false.\n // TODO: Clean this up when we refactor schedulers mid-version-8 or so.\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n unsubscribe() {\n if (!this.closed) {\n const { id, scheduler } = this;\n const { actions } = scheduler;\n\n this.work = this.state = this.scheduler = null!;\n this.pending = false;\n\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null!;\n super.unsubscribe();\n }\n }\n}\n", "import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\nimport { SchedulerLike, SchedulerAction } from './types';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an `Action`.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n * @deprecated Scheduler is an internal implementation detail of RxJS, and\n * should not be used directly. Rather, create your own class and implement\n * {@link SchedulerLike}. Will be made internal in v8.\n */\nexport class Scheduler implements SchedulerLike {\n public static now: () => number = dateTimestampProvider.now;\n\n constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return {number} A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param {function(state: ?T): ?Subscription} work A function representing a\n * task, or some unit of work to be executed by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler itself.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @return {Subscription} A subscription in order to be able to unsubscribe\n * the scheduled work.\n */\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Action } from './Action';\nimport { AsyncAction } from './AsyncAction';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncScheduler extends Scheduler {\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @type {boolean}\n * @internal\n */\n public _active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @type {any}\n * @internal\n */\n public _scheduled: TimerHandle | undefined;\n\n constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {\n super(SchedulerAction, now);\n }\n\n public flush(action: AsyncAction): void {\n const { actions } = this;\n\n if (this._active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this._active = true;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()!)); // exhaust the scheduler queue\n\n this._active = false;\n\n if (error) {\n while ((action = actions.shift()!)) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n *\n * Async Scheduler\n *\n * Schedule task as if you used setTimeout(task, duration)\n *\n * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript\n * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating\n * in intervals.\n *\n * If you just want to \"defer\" task, that is to perform it right after currently\n * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),\n * better choice will be the {@link asapScheduler} scheduler.\n *\n * ## Examples\n * Use async scheduler to delay task\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * const task = () => console.log('it works!');\n *\n * asyncScheduler.schedule(task, 2000);\n *\n * // After 2 seconds logs:\n * // \"it works!\"\n * ```\n *\n * Use async scheduler to repeat task in intervals\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * function task(state) {\n * console.log(state);\n * this.schedule(state + 1, 1000); // `this` references currently executing Action,\n * // which we reschedule with new state and delay\n * }\n *\n * asyncScheduler.schedule(task, 3000, 0);\n *\n * // Logs:\n * // 0 after 3s\n * // 1 after 4s\n * // 2 after 5s\n * // 3 after 6s\n * ```\n */\n\nexport const asyncScheduler = new AsyncScheduler(AsyncAction);\n\n/**\n * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.\n */\nexport const async = asyncScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nimport { SchedulerAction } from '../types';\nimport { animationFrameProvider } from './animationFrameProvider';\nimport { TimerHandle } from './timerHandle';\n\nexport class AnimationFrameAction extends AsyncAction {\n constructor(protected scheduler: AnimationFrameScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));\n }\n\n protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle | undefined {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if (delay != null ? delay > 0 : this.delay > 0) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue has no remaining actions with the same async id,\n // cancel the requested animation frame and set the scheduled flag to\n // undefined so the next AnimationFrameAction will request its own.\n const { actions } = scheduler;\n if (id != null && actions[actions.length - 1]?.id !== id) {\n animationFrameProvider.cancelAnimationFrame(id as number);\n scheduler._scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AnimationFrameScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n this._active = true;\n // The async id that effects a call to flush is stored in _scheduled.\n // Before executing an action, it's necessary to check the action's async\n // id to determine whether it's supposed to be executed in the current\n // flush.\n // Previous implementations of this method used a count to determine this,\n // but that was unsound, as actions that are unsubscribed - i.e. cancelled -\n // are removed from the actions array and that can shift actions that are\n // scheduled to be executed in a subsequent flush into positions at which\n // they are executed within the current flush.\n const flushId = this._scheduled;\n this._scheduled = undefined;\n\n const { actions } = this;\n let error: any;\n action = action || actions.shift()!;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions[0]) && action.id === flushId && actions.shift());\n\n this._active = false;\n\n if (error) {\n while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\n\n/**\n *\n * Animation Frame Scheduler\n *\n * Perform task when `window.requestAnimationFrame` would fire\n *\n * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler\n * behaviour.\n *\n * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.\n * It makes sure scheduled task will happen just before next browser content repaint,\n * thus performing animations as efficiently as possible.\n *\n * ## Example\n * Schedule div height animation\n * ```ts\n * // html:
\n * import { animationFrameScheduler } from 'rxjs';\n *\n * const div = document.querySelector('div');\n *\n * animationFrameScheduler.schedule(function(height) {\n * div.style.height = height + \"px\";\n *\n * this.schedule(height + 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * }, 0, 0);\n *\n * // You will see a div element growing in height\n * ```\n */\n\nexport const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\n\n/**\n * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.\n */\nexport const animationFrame = animationFrameScheduler;\n", "import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\n\n/**\n * A simple Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n *\n * ![](empty.png)\n *\n * A simple Observable that only emits the complete notification. It can be used\n * for composing with other Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n *\n * Log complete notification\n *\n * ```ts\n * import { EMPTY } from 'rxjs';\n *\n * EMPTY.subscribe({\n * next: () => console.log('Next'),\n * complete: () => console.log('Complete!')\n * });\n *\n * // Outputs\n * // Complete!\n * ```\n *\n * Emit the number 7, then complete\n *\n * ```ts\n * import { EMPTY, startWith } from 'rxjs';\n *\n * const result = EMPTY.pipe(startWith(7));\n * result.subscribe(x => console.log(x));\n *\n * // Outputs\n * // 7\n * ```\n *\n * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`\n *\n * ```ts\n * import { interval, mergeMap, of, EMPTY } from 'rxjs';\n *\n * const interval$ = interval(1000);\n * const result = interval$.pipe(\n * mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1, print a, b, c (each on its own)\n * // if x % 2 is not equal to 1, nothing will be output\n * ```\n *\n * @see {@link Observable}\n * @see {@link NEVER}\n * @see {@link of}\n * @see {@link throwError}\n */\nexport const EMPTY = new Observable((subscriber) => subscriber.complete());\n\n/**\n * @param scheduler A {@link SchedulerLike} to use for scheduling\n * the emission of the complete notification.\n * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.\n */\nexport function empty(scheduler?: SchedulerLike) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\n\nfunction emptyScheduled(scheduler: SchedulerLike) {\n return new Observable((subscriber) => scheduler.schedule(() => subscriber.complete()));\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && isFunction(value.schedule);\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\n\nfunction last(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n\nexport function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\n\nexport function popScheduler(args: any[]): SchedulerLike | undefined {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\n\nexport function popNumber(args: any[], defaultValue: number): number {\n return typeof last(args) === 'number' ? args.pop()! : defaultValue;\n}\n", "export const isArrayLike = ((x: any): x is ArrayLike => x && typeof x.length === 'number' && typeof x !== 'function');", "import { isFunction } from \"./isFunction\";\n\n/**\n * Tests to see if the object is \"thennable\".\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return isFunction(value?.then);\n}\n", "import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return isFunction(input[Symbol_observable]);\n}\n", "import { isFunction } from './isFunction';\n\nexport function isAsyncIterable(obj: any): obj is AsyncIterable {\n return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);\n}\n", "/**\n * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.\n * @param input The object that was passed.\n */\nexport function createInvalidObservableTypeError(input: any) {\n // TODO: We should create error codes that can be looked up, so this can be less verbose.\n return new TypeError(\n `You provided ${\n input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`\n } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`\n );\n}\n", "export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n", "import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return isFunction(input?.[Symbol_iterator]);\n}\n", "import { ReadableStreamLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport async function* readableStreamLikeToAsyncGenerator(readableStream: ReadableStreamLike): AsyncGenerator {\n const reader = readableStream.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n yield value!;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function isReadableStreamLike(obj: any): obj is ReadableStreamLike {\n // We don't want to use instanceof checks because they would return\n // false for instances from another Realm, like an