Táto stránka obsahuje a zároveň dokumentuje inštlačný script, aby si rozumel, čo sa bude diať. Tiež tu nájdeš popis parametrov, ktorými možeš správanie scriptu ovplyvniť.
To čo práve čítaš v Internet prehliadači, vyzerá pri stihanutí na PC odlišne.
Pre účely inštalácie sú odstránené sprievodné texty a niektoré časti kódu sa inak zoradia. Presný script, môžeš vidieť pridaním parametra https://linux.curo.sk/bootstrap?render=sh.
Tento script môžeš spustiť po bootnutí inštalačného média NixOS príkazom:
curl -sL "linux.curo.sk/bootstrap?" | sudo sh
Na rozdiel od sveta Windows, kde výrobcovia hardware testujú kompatibilitu svojich produktov a kde výrobca operačného systému kedykoľvek označí funkčný HW za nekompatibilný/nedostatočný (napr. pre verziu Windows 11), vo svete Linux je podpora HW rozdobenejšia, venuje sa jej množstvo dobrovoľníkov. Dôsledkom toho sa často vyžadujú manuálne zásahy pri inštalácii, čo mnohých používateľov už v počiatkoch odradí.
NixOS poskytuje inštalačné médium bez grafického inštalátora. Rôznorodosť HW prostredia často vyžaduje použitie príkazového riadku. Zachytiť všetky možnosti v grafickom prostredí a udržiavať ich aktuálne je značne náročné.
Tento script je pod stálym vývojom s motiváciou poskytnúť jednoduchý spôsob ako nainštalovať NixOS spustením jedného príkazového riadku. Jeho použitie je jednoduché na štandardných hardwarových zostavách. V prípade problému dokáže vytvoriť diagnostické podklady vhodné pre konzultáciu ohladne konfigurácie s komunitou.
Po úspešnom zavedení operačného systému NixOS na tvoj počítač je samotná správa a údržba NixOS a na ňom bežiacich programov veľmi jednoduchá. S prvými krokmi ti pomôže stránka, ako pokračovať po inštalácii.
Parameter | Hodnoty | Vysvetlenie |
---|---|---|
disk | /dev/sda |
Systémový názov disku, na ktorý sa nainštaluje systém |
fs | xfs |
Súborový systém, ktorý má byť použitý na hlavnom disku. |
net | názov zariadenia | Názov sieťovej kartky, ktorá sa má použiť na konfiguráciu prístupu na Internet. |
ip4 | ip adresa | Pokiaľ nie je určené používa sa DHCP na získanie IP adresy,Hodnota sa použije ako staticka IP adresa. |
wireless.enable | true alebo false |
Hodnota true aktivuje podporu bezdrôtových sietí. |
hostname | názov PC v sieti | Názov sieťovej kartky, ktorá sa má použiť na konfiguráciu prístupu na Internet. |
u | prázdne alebo heslo | Pokiaľ nie je použitý, tak sa diagnostické údaje zapíšu do temporárneho súbru /tmp/diag.log a prejde sa do interakcie s používateľom ohladne odoslania informácii na server.Použitie parametra odošle údaje na server bez ďalších otázok, pokiaľ je zadaná aj hodnota použije sa ako heslo pre zakódovanie údajov. |
render | sh alebo html |
Určuje, či sa má stránka vytvoriť pre Internetový prehliadač alebo príkazový riadok. |
debug-render-script | 1 alebo 0 |
Používa sa pri zlepšovaní a testovaní scriptov. |
Inštalačný script na prvom riadku povie NixOS, aby ho interpretoval pomocou štandardého Unix shellu. Ďalej ho nakonfiguruje tak, aby celé spracovanie skončilo, ak sa vyskytne akákoľvek chyba.
#!/usr/bin/env bash
set -e -o errexit
set -o pipefail
if [[ "${DEBUG}" == 'true' ]]; then
set -o xtrace
else
export DEBUG=
fi
set -o nounset
Pre zjednodušenie písania iných častí sa v úvode scriptu pridajú niektoré pomocné funkcie.
_hello() {
echo "Linux Boot v0.1.0"
}
_export_info() {
export BIOS=$([ -d /sys/firmware/efi/efivars ] && echo "UEFI" || echo "Legacy")
export SIZE_MEM=4
export FS=xfs
export SOURCE_QUERY="?"
}
export _ADD_PARAMS=()
_join() {
(($#)) || return 1 # At least delimiter required
local -- delim="$1" str IFS=
shift
str="${*/#/$delim}" # Expand arguments with prefixed delimiter (Empty IFS)
echo "${str:${#delim}}" # Echo without first delimiter
}
_download() {
if [[ $# -ne 2 ]]; then
echo 'missing parameters source and target'
exit 1
fi
local srcName=$1
local dstName=$2
local add=""
if [ ${#_ADD_PARAMS[@]} -gt 0 ]; then
add=$(_join '&' "${_ADD_PARAMS[@]}")
fi
# TODO test that local files work
# TODO should dstName contain the /mnt prefix or should we test if we are in installation mode?
_log "INFO kopirujem ${srcName} do $dstName"
curl -sL "linux.curo.sk/d/${srcName}?&${add}" -o "${dstName}"
}
_source() {
if [[ $# -eq 0 ]]; then
echo 'missing parameter what to source'
exit 1
fi
local scriptName=$1
source <(curl -sL "linux.curo.sk/${scriptName}?")
}
REVERT_COUNT=0
_revert() {
if [[ $# -eq 0 ]]; then
echo 'nothing to add to revert stack'
else
# reset revert on first call
if [[ $REVERT_COUNT -eq 0 ]]; then
_log "DEBUG reseting revert stack on: $1"
# rm -f /tmp/revert.sh
fi
echo $1 >>/tmp/revert.sh
fi
}
_log() {
local text=$1
echo ": ${text}"
# >&2
}
_requireRoot() {
if [ $UID != 0 ]; then
echo "fist execute: sudo -i"
exit 1
fi
}
isNixOS() {
if [ -f /etc/NIXOS ]; then
echo 1
else
echo 0
fi
}
assertIsNixOS() {
MESSAGE="${1:-Program vyžaduje prostedie Linux distribúcie NixOS.}"
if [ "x$(isNixOS)" == "x0" ]; then
echo "ERROR: $MESSAGE" >/dev/stderr
exit 1
fi
}
assertIsSupportedNixOS() {
REQUIRED_VER="${1:-22.05}"
assertIsNixOS
source /etc/os-release
if [ "${VERSION_ID}" != "${REQUIRED_VER}" ]; then
echo "ERROR: Vyžaduje sa verzia NixOS ${REQUIRED_VER}. Aktuálne máš spustenú verziu ${VERSION_ID}." >/dev/stderr
exit 1
fi
}
isNixInstaller() {
if grep -q "imports = \[ <nixpkgs/nixos/modules/installer" /etc/nixos/configuration.nix; then
echo 1
else
echo 0
fi
}
assertIsNixInstaller() {
MESSAGE="${1:-Program vyžaduje prostredie Linux distribúcie NixOS spustenej z inštalačného média.}"
if [ "x$(isNixInstaller)" == "x0" ]; then
echo "ERROR: $MESSAGE" >/dev/stderr
exit 1
fi
}
assertIsNotNixInstaller() {
MESSAGE="${1:-Program nie je možné spustiť v prostredí NixOS inštalačného média.}"
if [ "x$(isNixInstaller)" != "x0" ]; then
echo "ERROR: $MESSAGE" >/dev/stderr
exit 1
fi
}
# kontrola prostredia instalacie
assertIsSupportedNixOS
assertIsNixInstaller
# pozdravime pouzivatela a vypiseme aktualnu verziu
_hello
# zmazeme script, ktory sa da pouzit na vratenie do vychodzieho stavu pocas instalacie
# toto je skor vhodne pre vyvoj scriptu a v praxi je lepsie PC restartnut a zacat s instalaciou od znova
# script /tmp/revert.sh by si mal spustat len, ak rozumies prikazom, ktore do neho pocas instalacie pribudnu
rm -f /tmp/revert.sh
# mozno si spustil tento script bez dostatocneho opravnenia pre instalaciu
# instalacia ma za nasledok moznu stratu dat, takze nebudem pokracovat, pokial sa sam nerozhodnes
_requireRoot
# pripravime si niektore dolezite premenne, ktore sa pocas instalacie ocakavaju
_export_info
Preto, aby počítač mohol načítať operačný systém (Windows, Linix) z cdrom, USB alebo už z inštalácia na hard disku musí vedieť tieto zariadenia používať. To je úloha programu BIOS, ktorý je uložený na hlavnej doske počítača už od výrobcu.
V súčasnosti existujú dva štandardy BIOS programov. Starší sa nazýva Legacy BIOS a novši je UEFI. Počítače s UEFI je zväčša možné prepnúť do módu kompatibilného s Legacy BIOS.
Keďže zavádzací program obsluhuje hardware pri štarte PC, tak hlavný dôvod vzniku UEFI štandardu je preklenúť technický pokrok, s ktorým sa pri Legacy BIOS nepočítalo (napr. veľkosť hard diskov).
Práve pri diskoch pribudol ďalší rozdiel a to, že Legacy BIOS dokáže používať len disky, ktoré majú na svojom začiatku tzv. MBR záznam a nedokáže používať modernejší GPT záznam. UEFI dokáže zaviesť operačný systém tak z MBR ako aj GPT diskov.
Náš script je schopný rozlíšiť, či sa používa Leagacy BIOS alebo UEFI a podľa toho pripraví hard disk na inštaláciu.
Práve táto čast scriptu pracuje s dátami na hard disku a maže ich. Toto je nebezpečný moment počas inštalácie, pokiaľ máš v PC zapojené aj disky s dátami, o ktoré nechceš prísť.
if [ "$BIOS" = "Legacy" ] ; then
_log "INFO: going to prepare disk with script partition layout suitable for Legacy BIOS and MBR partition table"
Rozdelíme si disk na niekoľko častí. Nasleduje veľmi základné delenie:
### will partition disk as msdos
### if PartBootSize>0 then it will create boot partition
### calling template should:
### 1. format and mount $PART_BOOT
### 2. call lib_partition_mbr_mount.sh template to mount rest of the partitioned disks
export DISK=/dev/sda
DISKSEP=""
if [[ $DISK == /dev/nvme* ]]; then
DISKSEP="p"
fi
export DISKSEP
PART=1
PART_BOOT=
PART_SWAP=
PART_ROOT=
SIZE_BOOT=0
START_ROOT=$(expr $SIZE_MEM + $SIZE_BOOT)
#set +e
_log "INFO: disk ${DISK} will be initialized with legacy msdos partition"
parted -s ${DISK} -- mklabel msdos
#set -e
if [[ $SIZE_BOOT -gt 0 ]]; then
PART_BOOT=${DISK}${DISKSEP}${PART}
PART=$(expr $PART + 1)
_log "INFO: creating boot partition as ${PART_BOOT} of size ${SIZE_BOOT} GB"
parted -s ${DISK} -- mkpart primary 1MiB ${SIZE_BOOT}GiB
else
_log "INFO: will not use boot partition"
fi
PART_SWAP=${DISK}${DISKSEP}${PART}
PART=$(expr $PART + 1)
_log "INFO: creating swap partition on ${PART_SWAP} of size ${SIZE_MEM} GB"
if [[ $SIZE_BOOT -eq 0 ]]; then
START=1MiB
else
START=${SIZE_BOOT}GiB
fi
parted -s ${DISK} -- mkpart primary linux-swap ${START} ${SIZE_MEM}GiB
PART_ROOT=${DISK}${DISKSEP}${PART}
PART=$(expr $PART + 1)
_log "INFO: creating main partition on ${PART_ROOT} where size is disk size minus ${START_ROOT} GB"
parted -s ${DISK} -- mkpart primary ${START_ROOT}GiB 100%
Súbory zveríme do správy súborového systému XFS, ktorý je rýchly, stabilný a časom preverený.
### XFS related code
_log "INFO: formatting main partition on ${PART_ROOT} to xfs"
wipefs -a ${PART_ROOT} # needed to if the partition was zfs before
mkfs.xfs -f -L nixos ${PART_ROOT}
xfs_admin -L nixos ${PART_ROOT}
#mount /dev/disk/by-label/nixos /mnt
mount ${PART_ROOT} /mnt
### will mount /boot partition if needed
### will mount and activate swap if defined
if [ ! -z "$PART_BOOT" ]; then
# needed for legacy bios
mkfs.fat -F 32 -n boot ${PART_BOOT}
mkdir -p /mnt/boot
mount ${PART_BOOT} /mnt/boot
_revert "umount /mnt/boot"
fi
if [ ! -z "$PART_SWAP" ]; then
_log "INFO: formatting swap partition on ${PART_SWAP}"
mkswap -L swap $PART_SWAP
swapon $PART_SWAP
_revert "swapoff $PART_SWAP"
fi
_revert "umount -a"
export BOOT_CONFIGURATION_DOWNLOAD=nixos-configuration-mbr.nix
export PART_BOOT
export PART_SWAP
export PART_ROOT
export SIZE_BOOT
export START_ROOT
Iná situáica je ak sme zdetekovali novší UEFI BIOS. V podstate vytvoríme rovnaké prostredie, ale na disku s GPT tabuľkou a časťou disku vyhradenou na zavedenie UEFI bootovacieho programu.
else
_log "INFO: going to prepare disk with script partition layout suitable for UEFI BIOS and GPT partition table" Rozdelíme si disk na niekoľko častí. Nasleduje veľmi základné delenie:
### will partition disk as msdos
### if PartBootSize>0 then it will create boot partition
### calling template should:
### 1. format and mount $PART_BOOT
### 2. call lib_partition_mbr_mount.sh template to mount rest of the partitioned disks
export DISK=/dev/sda
DISKSEP=""
if [[ $DISK == /dev/nvme* ]]; then
DISKSEP="p"
fi
export DISKSEP
PART=1
PART_BOOT=
PART_SWAP=
PART_ROOT=
SIZE_BOOT=0
START_ROOT=$(expr $SIZE_MEM + $SIZE_BOOT)
#set +e
_log "INFO: disk ${DISK} will be initialized with GPT partition"
parted -s ${DISK} -- mklabel gpt
#set -e
parted ${DISK} -- mkpart primary 512MiB -8GiB
parted ${DISK} -- mkpart primary linux-swap -8GiB 100%
parted ${DISK} -- mkpart ESP fat32 1MiB 512MiB
parted ${DISK} -- set 3 esp on
PART_BOOT=${DISK}${DISKSEP}3
PART_SWAP=${DISK}${DISKSEP}2
PART_ROOT=${DISK}${DISKSEP}1
#parted ${DISK} print > /tmp/parts.txt
#curl -LX PUT linux.curo.sk --data-binary @"/tmp/parts.txt"
Súbory zveríme do správy súborového systému XFS, ktorý je rýchly, stabilný a časom preverený.
### XFS related code
_log "INFO: formatting main partition on ${PART_ROOT} to xfs"
mkfs.fat -F 32 -n boot ${PART_BOOT}
wipefs -a ${PART_ROOT} # needed to if the partition was zfs before
mkfs.xfs -f -L nixos ${PART_ROOT}
xfs_admin -L nixos ${PART_ROOT}
sleep 3
mount /dev/disk/by-label/nixos /mnt
# mount ${PART_ROOT} /mnt
mkdir -p /mnt/boot
mount /dev/disk/by-label/boot /mnt/boot
export BOOT_CONFIGURATION_DOWNLOAD=nixos-configuration-uefi.nix
export PART_BOOT
export PART_SWAP
export PART_ROOT
export SIZE_BOOT
export START_ROOT
fi
V prvej rade necháme inštalačný program vykonať svoju najdôležitejšiu úlohu a tou je vygenerovať NixOS konfiguráciu, ktorá by mala byť funkčná na zariadení s týmto hardware.
nixos-generate-config --root /mnt
# extract detected network interface name
NET=$(sed -n -e 's/.*networking.interfaces\.\([a-z0-9]\+\)\.useDHCP = true;.*/\1/p' /mnt/etc/nixos/configuration.nix)
_ADD_PARAMS+=("net=${NET}")
Ide nám hlavne o vznik súboru /mnt/etc/nixos/hardware.nix
, ktorý obsahuje informácie potrebné pri spúšťaní Liunuxu
a ovládačov zariadení.
Zároveň vznikol aj súbor /mnt/etc/nixos/configure.nix
, ktorý je hlavným konfiguračným súborom NixOS a vlastne on zabezpečuje,
že sa spracuje /mnt/etc/nixos/hardware.nix
. Používam pojem spracuje
, pretože na rozidel od iných distribúciu Linux
sa konfigurácia v /mnt/etc/nixos
nenačítava pri štarte OS,
ale sa zapracuje hlboko do jeho štruktúr pri vykonaní inštalácie alebo aktualizácie.
My tento súbor nahradíme modulárnejším spôsobom, aby sme neskôr mohli jednoduchšie vykonať dodatočnú konfiguráciu NixOS.
mv /mnt/etc/nixos/configuration.nix /mnt/etc/nixos/configuration.nix-DELETE
_download nixos-configuration.nix /mnt/etc/nixos/configuration.nix
_download nixos-configuration-users.nix /mnt/etc/nixos/users.nix
_download ${BOOT_CONFIGURATION_DOWNLOAD} /mnt/etc/nixos/boot-configuration.nix
_download nixos-configuration-empty.nix /mnt/etc/nixos/custom-configuration.nix
Atribút system.stateVersion
sa nastavuje podľa verzie NixOS na inštalačnom médiu.
Ďalšie aktualizácie systému na vyššie verzie ho bežne nemenia
a prispôsobujú svoje akcie tejto hodnote. Pre zjednodušenie údržby tohto scriptu
túto hodnotu
STATE_VER=$(cat /mnt/etc/nixos/configuration.nix-DELETE | sed -n 's/^.*system.stateVersion\s*=\s*"\s*\([^"]*\).*$/\1/p')
sed -i "s/system.stateVersion =.*/system.stateVersion = \"${STATE_VER}\"; # Did you read the comment?/" /mnt/etc/nixos/configuration.nix
Samotná inštalácia chvíľu potrvá v závislosti od rýchlosti pripojenia k Internetu.
# TODO this may fail on low memory HW !!!
# nix-channel --update
# nixos-rebuild switch
nixos-install --show-trace --root /mnt --no-root-password
Pridajme moduly Curo, ale zatiaľ ich neaktivujme, nech vidíme, že systém naštartuje bez problémov.
# TODO do this based on curomd and/or curoui flags
# we boot with basic config
# but we already copy configs which should finish the configuration
_download nixos-curo-base.nix /mnt/etc/nixos/curo-base.nix
_download nixos-configuration-empty.nix /mnt/etc/nixos/curo-vpn.nix
_download nixos-configuration-empty.nix /mnt/etc/nixos/curo-md.nix
_download nixos-configuration-empty.nix /mnt/etc/nixos/curo-ui.nix
_download nixos-configuration-empty.nix /mnt/etc/nixos/backup.nix
_download nixos-configuration-empty.nix /mnt/etc/nixos/samba.nix
# TODO we need to be able to edit this
_download nixos-custom-configuration-curo.nix /mnt/etc/nixos/custom-configuration.nix
cat <<EOF
██╗ ██╗ ██████╗ ████████╗ ██████╗ ██╗ ██╗ ██████╗
██║ ██║██╔═══██╗╚══██╔══╝██╔═══██╗██║ ██║██╔═══██╗
███████║██║ ██║ ██║ ██║ ██║██║ ██║██║ ██║
██╔══██║██║ ██║ ██║ ██║ ██║╚██╗ ██╔╝██║ ██║
██║ ██║╚██████╔╝ ██║ ╚██████╔╝ ╚████╔╝ ╚██████╔╝██╗██╗██╗
╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═══╝ ╚═════╝ ╚═╝╚═╝╚═╝
EOF
_log "INFO: Reštartuj počítač (príkaz 'sudo reboot') a naštartuj ho z pevného disku."
Môžeš PC reštartnúť a daj pozor, aby sa opäť nenaštartovalo z inštalačného média.