everest-web/install.html
2023-03-31 11:46:59 -04:00

323 lines
18 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<title>Everest Linux - Install</title>
<link type="text/css" rel="stylesheet" href="css/everest.css"/>
</head>
<body>
<!-- Navbar -->
<div class="sidenav">
<a href="index.html">Home</a>
<a href="about.html">About</a>
<a href="install.html">Install</a>
<a href="https://git.everestlinux.org/EverestLinux/glacier-pkgs">Packages</a>
<a href="download.html">Downloads</a>
<a href="https://git.everestlinux.org/EverestLinux/wiki">Wiki</a>
<a href="errata.html">Errata</a>
<a href="https://git.everestlinux.org">Git</a>
</div>
<!-- Rest of page -->
<div class="main">
<h2>Installation Handbook</h2>
<p>This guide is the official installation handbook for Everest Linux.</p>
<warnhead><strong>WARNING:</strong></warnhead>
<div class="warning">
<p>Using unofficial guides is not recommended, as they may be outdated, or unreliable. The official guide is located at https://www.everestlinux.org/install.</p>
</div>
<p></p>
<warnhead><strong>WARNING:</strong></warnhead>
<div class="warning">
<p>Simply copy and pasting commands from this guide won't cut it, and you'll most likely end up with a broken installation. Ensure you know what each command does.</p>
</div>
<p></p>
<warnhead><strong>WARNING:</strong></warnhead>
<div class="warning">
<p>Everest is not for the faint of heart. If you have never touched Linux in your life, Everest is most certainly not for you. Check out https://linuxmint.com if you want a great Linux experience that works out of the box.</p>
</div>
<p></p>
<warnhead><strong>WARNING:</strong></warnhead>
<div class="warning">
<p>Everest at its current state is highly experimental. Install at your own risk.</p>
</div>
<p>If you need assistance, reach out to us on IRC (libera.chat, #everestlinux) or Discord.</p>
<h2>Prerequisites</h2>
<p>The following steps are required to complete an installation:</p>
<ol>
<li>Set up the build environment</li>
<li>Download a system image</li>
<li>Unpack the system image</li>
<li>Change root into the new system</li>
<li>Install programs</li>
<li>Install the Linux kernel</li>
<li>Set up init scripts and services</li>
<li>Install the bootloader</li>
<li>Reboot the system</li>
</ol>
<i>Note that Everest is highly flexible. That being said, it is up to you to make modifications yourself.</i>
<p>Run commands prefixed with <code>(user)$</code> as an unprivileged user.</p>
<p>Run commands prefixed with <code>(root)#</code> as the root user.</p>
<p>Run commands prefixed with <code>(chroot)#</code> inside the chroot environment.</p>
<h2>Set up the environment</h2>
<p>Everest needs a proper environment set up in order to install correctly.</p>
<p>A system mountpoint is where the new system's root (/) will be. Where you put this doesn't matter, as the host system used to build the system won't be included</p>
<p>in the final installation. In this example, we will use /mnt/everest.</p>
<p>Create a system mountpoint:</p>
<code>(root)# mkdir -pv /mnt/everest</code>
<p>A variable pointing to the system mountpoint may be useful in the future, as it will save you a bit of typing.</p>
<p>Create a variable for the system mountpoint:</p>
<code>(root)# SYS_MNT=/mnt/everest</code>
<p>Partitions must be created on the drive you wish to install Everest to. The typical partition layout on an Everest system may differ from othet distributions.</p>
<p>The typical layout is:</p>
<table>
<tr>
<th>Mount point</th>
<th>Type</th>
<th>Suggested size</th>
</tr>
<tr>
<td>/mnt/everest/boot</td>
<td>EFI system partition (esp)</td>
<td>No smaller than 256 MB, no larger than 1 GB</td>
</tr>
<tr>
<td>/mnt/everest/usr</td>
<td>/usr</td>
<td>No smaller than 25 GB</td>
</tr>
<tr>
<td>/mnt/everest</td>
<td>Root filesystem</td>
<td>Remainder of the drive</td>
</tr>
<table>
<p>Partition the target drive:</p>
<code>(root)# cfdisk /dev/sdX</code>
<p>A valid filesystem is required on the drive.</p>
<p>Most filesystems should work, however ensure the system has the corresponding package for whatever filesystem you choose.</p>
<p>For example, if XFS is used, when installing the system:</p>
<code>(chroot)# gpkg -f world/xfsprogs</code>
<p>In this example, Ext4 will be used.</p>
<p>Create a filesystem:</p>
<code>(root)# mkfs.ext4 /dev/root</code>
<p></p>
<code>(root)# mkfs.ext4 /dev/usr</code>
<p>The EFI system partition (esp) must be formatted as FAT32.</p>
<code>(root)# mkfs.vfat -F32 /dev/boot</code>
<p>Mount the root partition to the system mountpoint:</p>
<code>(root)# mount /dev/root /mnt/everest</code>
<p>Some additional directories may need to be created.</p>
<p>Create extra needed directories:</p>
<code>(root)# mkdir /mnt/everest/boot</code>
<p></p>
<code>(root)# mkdir /mnt/everest/usr</code>
<p>Mount the remaining partitions:</p>
<code>(root)# mount /dev/boot /mnt/everest/boot</code>
<p></p>
<code>(root)# mount /dev/usr /mnt/everest/usr</code>
<p>Create remaining directories on /usr with mkusrskel:</p>
<code>(root)# mkusrskel -d /mnt/everest/usr</code>
<h2>Downloading a system image</h2>
<p>An Everest system image provides an incomplete root filesystem which users can build a system off of. Users should be careful of which</p>
<p>image they choose, as switching in the future is trivial, time consuming, and requires rebuilding a lot of packages. It's a lot better</p>
<p>to get it right the first time, rather than trying to get it right later.</p>
<p>Do some thorough planning to ensure you get the right system image. For instance, ask yourself a few questions, such as:</p>
<ol>
<li>Do I need 32 bit libraries?</li>
<li>Will I be using proprietary software that cannot be recompiled?</li>
<li>Do I require a specific C library for my hardware setup?</li>
<li>Do I want to set up NSA Security Enhanced Linux (SELinux)</li>
<li>Do I want an init system other than Busybox's built in init configured out of the box?</li>
</ol>
<warnhead><strong>WARNING:</strong></warnhead>
<div class="warning">
<p>Make sure you're happy with the system image you choose. While migrating in the future is possible, it requires rebuilding the majority of the system.</p>
</div>
<p>Downloading a system image that is severely out of date is not recommended. Many programs, such as the kernel or SSL library will be vulnerable to attacks.</p>
<p>Download a system image with wget:</p>
<code>(user)$ wget https://git.everestlinux.org/EverestLinux/everest/raw/branch/main/releases/SYSTEM_IMAGE.tar.xz</code>
<h2>Unpacking the system image</h2>
<p>Now that a system image has been downloaded, we can unpack it.</p>
<p>Ensure the system image is inside the system mountpoint, otherwise you may run into trouble.</p>
<p>Since a Linux root filesystem is complex, and many different files need to be owned by certain users, or have certain permissions, simply running `tar xf` will</p>
<p>result in a broken image. A couple extra flags are needed to preserve these permissions in the unpacked image.</p>
<p>Unpack the system image:</p>
<code>(root)# tar -xpvf SYSTEM_IMAGE --xattrs-include='*.*' --numeric-owner</code>
<p>If this command was run correctly, you shouldn't need to edit any permissions manually.</p>
<h2>Chrooting into the system mountpoint</h2>
<p>Although we have a relatively complete root filesystem at this point, many essential programs are still missing. These include the kernel and bootloader. Without these,</p>
<p>the system is unable to boot. At this point, we must chroot into the new system. This will allow us to complete the system without booting.</p>
<p>Chroot into the new system:</p>
<code>(root)# everest-chroot /mnt/everest</code>
<p>Change the shell prompt to differentiate the two environments:</p>
<code>(chroot)# echo "export PS1='(chroot) ${PS1}'" >> /etc/profile && source /etc/profile</code>
<h2>Install packages</h2>
<p>Any programs you wish to install, such as display servers, login managers, and desktop environments, should be installed now. The kernel can take multiple</p>
<p>hours to compile on some hardware.</p>
<p>Glacier manages packages on the system, and it allows users to install, or 'merge' their own. It is recommended to get familiar with this system.</p>
<wiki>See: <a href="https://git.everestlinux.org/EverestLinux/wiki/wiki/Introduction-to-Glacier">Introduction to Glacier</a></wiki>
<h2>Install the Linux kernel</h2>
<p>The most important part of the system, the kernel, which allows hardware to communicate with software, is ready to be installed.</p>
<p>If needed, merge the linux-firmware package, which provides device firmware:</p>
<code>(chroot)# gpkg -f world/linux-firmware</code>
<p>At this stage, you can decide which kernel you want to install. In Everest's package repository, many prebuilt kernels are available, as well as the</p>
<p>source code, should you wish to compile your own.</p>
<p><strong>Option 1: Custom kernel</strong></p>
<p>Compiling a custom kernel is the recommended option for most users, as it allows the most control.</p>
<p>Download the kernel's source tree:</p>
<code>(chroot)# gpkg -f world/linux</code>
<p>The source tree will be located under /usr/src/linux.</p>
<p>Inside /usr/src/linux, ensure the source tree is completely clean by running the following:</p>
<code>(chroot)# make mrproper</code>
<p>The kernel must be configured before it is compiled.</p>
<p> Users installing systemd should enable IPv6 in the kernel configuration:</p>
<khead><strong>KERNEL: </strong> Enbable support for IPv6</khead>
<div class="kernel">
<p>Networking support ---></p>
<p>&nbsp&nbsp&nbsp&nbsp&nbsp&nbspNetworking options ---></p>
<p>&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<*> The IPv6 protocol [CONFIG_IPV6]</p>
</div>
<p> Recommended options are not provided - it is up to you to configure the kernel for your setup.</p>
<p>Configure the kernel:</p>
<code>(chroot)# export EVEREST_ARCH="$(echo $MACHTYPE)"</code>
<p></p>
<code>(chroot)# ARCH=$EVEREST_ARCH make defconfig</code>
<p></p>
<code>(chroot)# ARCH=$EVEREST_ARCH make menuconfig</code>
<p>Once the kernel is configured, compile it:</p>
<code>(chroot)# make && make modules install</code>
<p><strong>Option 2: Distribution kernel</strong></p>
<p>For those who do not wish to configure a custom kernel, or likewise do not have the time or system resources to do so, a distribution kernel</p>
<p>provides a binary kernel. However, there are a couple of pitfalls to this option:</p>
<ol>
<li>Distribution kernels are not fine tuned to your system, they are generic and bloated</li>
<li>Distribution kernels are managed by their respective development teams, who must be relied upon for fixes</li>
<li>Distribution kernels deprive the user of the experience gained by configuring and compiling a custom kernel</li>
</ol>
<p>Everest offers many distribution kernels, some notable ones include:</p>
<ol>
<li>linux-everest</li>
<li>linux-zen</li>
<li>linux-hardened</li>
</ol>
<p>Install a distribution kernel:</p>
<code>(chroot)# gpkg -f world/linux-{everest,zen,hardened}</code>
<h2>Build an initramfs</h2>
<p>Depending on your system, an initramfs may be required. For example, users of distribution kernels will ALWAYS need to build an initramfs,</p>
<p>while those who configured and compiled their own will usually not need one.</p>
<p>To build an initramfs, you will need dracut. Install dracut:</p>
<code>(chroot)# gpkg -f world/dracut</code>
<p>Build an initramfs:</p>
<code>(chroot)# dracut</code>
<h2>Configure the system</h2>
<p>Now that the kernel is installed, various other parts of the system should be configured.</p>
<p>Create /etc/fstab, which provides the system with information about mounted filesystems.</p>
<p>For example, on a system with a root, /usr, and boot partition, /etc/fstab will look like this:</p>
<fhead><strong>FILE:</strong> /etc/fstab</fhead>
<div class="file">
<p>/dev/sda1&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp/&nbsp&nbsp&nbsp&nbsp&nbsp&nbspext4&nbsp&nbsp&nbsp&nbsp&nbsp&nbspnoatime&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp0 1</p>
<p>/dev/sda2&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp/usr&nbsp&nbsp&nbsp&nbsp&nbsp&nbspext4&nbsp&nbsp&nbsp&nbsp&nbsp&nbspnoatime&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp0 1</p>
<p>/dev/sda3&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp/boot&nbsp&nbsp&nbsp&nbsp&nbsp&nbspvfat&nbsp&nbsp&nbsp&nbsp&nbsp&nbspdefaults,noatime&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp0 2</p>
</div>
<p>System services that some may find helpful, such as a cron daemon or logging daemon, should be set up now.</p>
<p>On systems using systemd:</p>
<code>(chroot)# systemctl enable cronie chronyd sysklogd</code>
<p>On systems without a service manager, all services under /etc/init.d will be initialied by rcS.</p>
<p>The system's timezone is read from /etc/localtime, which is a symlink.</p>
<p>In case timezone information is missing from /usr/share/zoneinfo, install it:</p>
<code>(chroot)# gpkg -f world/tzdata</code>
<p>Create /etc/localtime:</p>
<code>(chroot)# ln -sv /usr/share/zoneinfo/<i>Region</i>/<i>City</i> /etc/localtime</code>
<p>The hostname assigns a name to the system. This can be changed at any time.</p>
<p>Set the hostname:</p>
<code>(chroot)# echo <i>hostname</i> > /etc/hostname</code>
<p>Or, on systemd:</p>
<code>(chroot)# hostnamectl hostname <i>hostname</i></code>
<p>A network connection is very important, and there are multiple ways to set one up.</p>
<warnhead><strong>WARNING:</strong></warnhead>
<div class="warning">
<p>Ensure your network is fully set up before proceeding with any other steps. It's better to get it right the first time, rather than trying to fix it later.</p>
</div>
<p>First, ensure the desired network interface is not blocked by rfkill:</p>
<code>(chroot)# rfkill</code>
<p>If the network interface is blocked:</p>
<code>(chroot)# rfkill unblock <i>interface</i></code>
<p>The network can now be configured.</p>
<p><strong>Option 1: Busybox networking</strong></p>
<p>Busybox includes networking tools that can quickly configure the network.</p>
<p>On a busybox system, the network can be set up with one simple command:</p>
<code>(chroot)# ifup</code>
<p>rcS will also run this command at boot time.</p>
<p><strong>Option 2: dhcpcd and wpa_supplicant</strong></p>
<p>On systems without Busybox, dhcpcd can be used. This is another very simple solution.</p>
<p>Install dhcpcd:</p>
<code>(chroot)# gpkg -f world/dhcpcd</code>
<p>Install wpa_supplicant:</p>
<code>(chroot)# gpkg -f world/wpa_supplicant</code>
<p>rcS will start dhcpcd at boot time.</p>
<p><strong>Option 3: NetworkManager</strong></p>
<p>NetworkManager is recommended on systems using systemd as the init system.</p>
<p>NetworkManager should be fairly easy and straightforward to set up for most.</p>
<p>Install NetworkManager:</p>
<code>(chroot)# gpkg -f world/networkmanager</code>
<p>Enable and start NetworkManager:</p>
<code>(chroot)# systemctl enable --now NetworkManager</code>
<p>The /etc/hosts file is used to resolve IP addresses not resolved by the DHCP server.</p>
<fhead><strong>FILE:</strong> /etc/hosts</fhead>
<div class="file">
<p>127.0.0.1&nbsp&nbsp&nbsp&nbsp&nbsp&nbsplocalhost</p>
<p>::1&nbsp&nbsp&nbsp&nbsp&nbsp&nbsplocalhost</p>
<p>127.0.1.1&nbsp&nbsp&nbsp&nbsp&nbsp&nbsplocaldomain <i>hostname</i></p>
</div>
<p>The root password is extremely important, as it controls access to the root user, the most powerful user on the system.</p>
<p>Ensure your chosen root password is strong enough where it cannot be guessed easily.</p>
<p>Set the root password:</p>
<code>(chroot)# passwd</code>
<p>If remote access is desired on the system, install sshd:</p>
<code>(chroot)# gpkg -f world/sshd</code>
<p>Using the root account for daily use is not recommended. Create an unprivileged user:</p>
<code>(chroot)# adduser USERNAME</code>
<p>A privilege elevation program is recommended for most users. The most popular choices are sudo and doas, with doas being recommended for most users.</p>
<p>Install doas:</p>
<code>(chroot)# gpkg -f world/doas</code>
<p>Create /etc/doas.conf:</p>
<fhead><strong>FILE:</strong> /etc/doas.conf</fhead>
<div class="file">
<p>permit USER as root</p>
</div>
<h2>Configure the bootloader</h2>
<p>Now that the system is correctly configured and the kernel is installed, the final step can proceed - installing the bootloader. Without a bootloader, the system</p>
<p>will be unable to load the Linux kernel upon boot. This guide only mentions GRUB, however note that other bootloaders are supported.</p>
<p>Merge GRUB for BIOS:</p>
<code>(chroot)# gpkg -f world/grub-bios</code>
<p>Merge GRUB for UEFI:</p>
<code>(chroot)# gpkg -f world/grub-efi</code>
<p>Install GRUB for BIOS:</p>
<code>(chroot)# grub-install /dev/sda</code>
<p>Install GRUB for UEFI:</p>
<code>(chroot)# grub-install --target=x86_64-efi --efi-directory=/boot</code>
<p>For GRUB to work correctly, a configuration file must be created. Create one now:</p>
<code>(chroot# grub-mkconfig -o /boot/grub/grub.cfg</code>
<h2>Exit chroot</h2>
<p>The system has been finished. If everything is done to your liking, you can now exit the chroot environment.</p>
<code>(chroot)# exit</code>
<p>Unmount all mounted partitions:</p>
<code>(root)# umount -l /mnt/everest/dev/{shm,pts}</code>
<p></p>
<code>(root)# umount -R /mnt/everest</code>
<p>Reboot the system:</p>
<code>(root)# reboot</code>
<p>Ensure the installation medium is removed, or else you will not boot into the new system, rather back into the installation medium.</p>
<h2>Conclusion</h2>
<p>If all went well, Everest should boot up with no problems.</p>
<p>Remove the system image from /:</p>
<code>(root)# rm /everestlinux-*.tar.*</code>
<p>With the installation out of the way, you now have a minimal Linux environment to play around in, and to build around.</p>
<p>Thank you for installing Everest Linux!</p>
</div>
<footer>
<p>Copyright (C) 2021-2023 Everest Linux</p>
<p>Linux (R) is a registered trademark of Linus Torvalds.</p>
<p>Everest Linux is provided AS IS, WITHOUT WARRANTY.</p>
</footer>