ŹRÓDŁO Aby zainstalować system Guix nie potrzebuję używać graficznego instalatora. Jednym z moich narzędzi jest system Guix zainstalowany na pamięci przenośnej.


Dzięki temu mogę instalować kolejne systemy Guix względnie trywialnie przez skopiowanie jednego pliku i przygotowanie partycji.

Przygotowanie modułu instalacyjnego

Na wspomnianej pamięci przenośnej mam kopię repozytorium kanału Deployment, w którym znajdują się moduły definiujące konfiguracje systemów.


[ŹRÓDŁO] Podręcznik Guile o ładowaniu modułów
W repozytorium Deployment kopiuję konfigurację przenośnego systemu, która jest względnie uniwersalna w porównaniu do innych, do nowego pliku o nazwie odpowiadającej nazwie nowego systemu.

$ cp deployment/systems/mcdowell.scm deployment/systems/cokolwiek.scm

W nowo skopiowanym pliku zmieniam nazwę modułu i nazwę systemu.

(define-module (deployment systems cokolwiek)
  #:use-module ( (gnu packages package-management)
                 #:prefix gnu:packages:package-management:)
  #:use-module ( (gnu services)
                 #:prefix gnu:services:)
  #:use-module ( (gnu services base)
                 #:prefix gnu:services:base:)
  
  #:use-module ( (users id1000)
                 #:prefix users:id1000:))

(define system-name
  "cokolwiek")

Zanim zapomnę, zapisuję i wypycham te zmiany do kanonicznego repozytorium.

$ git add .

$ git commit -am 'systems: add cokolwiek system'
[master 45ea36f] systems: add cokolwiek system
 1 file changed, 105 insertions(+)
 create mode 100644 deployment/systems/cokolwiek.scm

$ git push
Enter passphrase for key '/home/marek/.ssh/id_rsa':
Wymienianie obiektów: 8, gotowe.
Zliczanie obiektów: 100% (8/8), gotowe.
Kompresja delt z użyciem do 32 wątków
Kompresowanie obiektów: 100% (4/4), gotowe.
Zapisywanie obiektów: 100% (5/5), 2.07 KiB | 2.07 MiB/s, gotowe.
Total 5 (delta 2), reused 0 (delta 0), pack-reused 0 (from 0)
To ssh://marekpasnikowski.pl:23/deployment.git
   ade0553..45ea36f  master -> master

Przygotowanie partycji

ŹRÓDŁO Aby zainstalować nowy system, konieczne jest przygotowanie magazynu danych. Mój sposób instalacji polega wydzieleniu partycji w kolejności od największej do najmniejszej i dopełnieniu pustej przestrzeni pamięcią wymiany. Podstawową ideą jest wydzielenie tylko połowy pamięci na partycję główną, aby zachować dużą część tranzystorów pamięci jako nadmiar przedłużający żywotność całego urządzenia magazynowego.


Najpierw upewniam się, pod jakim identyfikatorem jest magazyn danych.

$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda      8:0    0 931,5G  0 disk
sdb      8:16   1 114,6G  0 disk
├─sdb1   8:17   1    64G  0 part /gnu/store
│                                /
├─sdb2   8:18   1     1G  0 part /boot
├─sdb3   8:19   1   128M  0 part
└─sdb4   8:20   1  49,5G  0 part [SWAP]

Używam programu cfdisk, aby zbudować odpowiednią tablicę partycji.

$ sudo cfdisk /dev/sda
Hasło:

Synchronizacja dysków.

$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda      8:0    0 931,5G  0 disk
├─sda1   8:1    0   512G  0 part
├─sda2   8:2    0     1G  0 part
├─sda3   8:3    0   128M  0 part
└─sda4   8:4    0 418,4G  0 part
sdb      8:16   1 114,6G  0 disk
├─sdb1   8:17   1    64G  0 part /gnu/store
│                                /
├─sdb2   8:18   1     1G  0 part /boot
├─sdb3   8:19   1   128M  0 part
└─sdb4   8:20   1  49,5G  0 part [SWAP]

Mógłbym pominąć miejsce na partycję BOOT, ale jeśli ją skonfiguruję, to zachowam zdolność rozruchu tego magazynu danych na innych komputerach opartych na starej technologii rozruchu.

DO ZROBIENIA Za pomocą graficznego programu gparted ustawiam partycje analogicznie do obecnie używanego systemu. Jedynym problemem jest niezdolność programu gparted do nadania etykiety dla partycji rozruchowej. Potrzebny jest do tego program fatlabel. Powinienem opracować listę poleceń tekstowych do etykietowania partycji.

$ sudo fatlabel /dev/sda2 COKOLWIEK

W tym momencie komputer jest przygotowany do instalacji nowego systemu.

Instalacja

ŹRÓDŁO Podręcznik Guix wskazuje na potrzebę odpowiedniego zamontowania docelowych partycji.

$ sudo mount /dev/sda1 /mnt

$ sudo herd start cow-store /mnt
herd: error: service 'cow-store' could not be found

Zakładam, że jest to przestarzała treść podręcznika i ignoruję ten błąd.


Wewnątrz repozytorium kanału Deployment wywołuję polecenie instalacyjne.

$ sudo guix system init deployment/systems/cokolwiek.scm /mnt
guix system: błąd: 'deployment/systems/cokolwiek.scm' does not return an operating system or an image

Moje moduły z definicjami systemów nie zawierają kodu wykonawczego. Ponieważ moje próby wywołania zmiennej bezpośrednio w poleceniu guix system init były bezskuteczne, chwilowo dopisuję wywołanie definicji systemu na końcu modułu i tym razem instalacja rusza i kończy się sukcesem.

$ sudo guix system init deployment/systems/cokolwiek.scm /mnt
Updating channel 'guix' from Git repository at 'https://git.marekpasnikowski.pl/git/guix.git'...
guix system: ostrzeżenie: pulled channel 'guix' from a mirror of https://git.guix.gnu.org/guix.git, which might be stale
Updating channel 'deployment' from Git repository at 'https://git.marekpasnikowski.pl/git/deployment.git'...
Updating channel 'guix-rust-past-crates' from Git repository at 'https://git.marekpasnikowski.pl/git/guix-rust-past-crates.git'...
guix system: ostrzeżenie: pulled channel 'guix-rust-past-crates' from a mirror of https://codeberg.org/guix/guix-rust-past-crates.git, which might be stale
Updating channel 'nonguix' from Git repository at 'https://git.marekpasnikowski.pl/git/nonguix.git'...
guix system: ostrzeżenie: pulled channel 'nonguix' from a mirror of https://gitlab.com/nonguix/nonguix, which might be stale
Updating channel 'sovereign' from Git repository at 'https://git.marekpasnikowski.pl/git/sovereign.git'...
substitute: looking for substitutes on 'http://192.168.10.3:8080'... 100.0%
substitute: looking for substitutes on 'https://substitutes.nonguix.org'... 100.0%
substitute: looking for substitutes on 'https://nonguix-proxy.ditigal.xyz/'... 100.0%
substitute: looking for substitutes on 'https://bordeaux.guix.gnu.org'... 100.0%
substitute: looking for substitutes on 'https://ci.guix.gnu.org'... 100.0%
substitute: looking for substitutes on 'http://192.168.10.3:8080'... 100.0%
substitute: looking for substitutes on 'http://192.168.10.3:8080'... 100.0%
 module-import-compiled  1.5MiB                                                                                         4.2MiB/s 00:00 ▕██████████████████▏ 100.0%
 module-import-compiled  1.5MiB                                                                                         4.4MiB/s 00:00 ▕██████████████████▏ 100.0%
building /gnu/store/j2diaxn07l1lf5p6s4md53zpays8n2ga-config.scm.drv...
building /gnu/store/f1q7isyx24lm3pzkh5h7li5xf99b12d2-git.scm.drv...
building /gnu/store/4w0c7yxg69dzvpi544zrglf2vl5fgnzj-hash.scm.drv...
building /gnu/store/2hk9waj947hgn5hqqmqp655g8h1lgxal-module-import.drv...
building /gnu/store/4vdy93jg2yr50j0mkw00v1s4aahkhvnr-module-import.drv...
building /gnu/store/pvm5a4cb65igqf12znd8x6fbk0wmbryi-compute-guix-derivation.drv...
Computing Guix derivation for 'x86_64-linux'... \
substitute: looking for substitutes on 'http://192.168.10.3:8080'... 100.0%
substitute: looking for substitutes on 'https://substitutes.nonguix.org'... 100.0%
substitute: looking for substitutes on 'https://nonguix-proxy.ditigal.xyz/'... 100.0%
substitute: looking for substitutes on 'https://bordeaux.guix.gnu.org'... 100.0%
substitute: looking for substitutes on 'https://ci.guix.gnu.org'... 100.0%
The following derivations will be built:
  /gnu/store/f115kngj8fyymi5gpqn03fmiqrn0w33a-etc.drv
  /gnu/store/04qiqbqh0v1vkg32d8pq8f863raygalq-activate-service.scm.drv
  /gnu/store/2dabf6vlbj6kvdh7b7wcxldn8ak9rafy-activate.scm.drv
  /gnu/store/6f5bq5hxm2gx04qd4frw1qmddidp80hh-provenance.drv
  /gnu/store/q8ni4qmjqwr87rw3mqffma4kys5rw7sr-init.drv
  /gnu/store/svb9q5i0w0xmc4gk3028m2dqi76qhra8-raw-initrd.drv
  /gnu/store/89hrfinkj8sa1aizvl3wmqqlhfvqngj8-combined-initrd.drv
  /gnu/store/gl7wzay96b4ynzn1acxwpmgvsavmf6f5-parameters.drv
  /gnu/store/j0j1avdy377nvh4f93x05j65wjmprklc-shepherd-swap-cokolwiek-swap.scm.drv
  /gnu/store/4harprlmnjsfgqwkkvi2h52ym4ay0s7n-shepherd-swap-cokolwiek-swap.go.drv
  /gnu/store/zsslwylhfhxb4pld9ay6pg48lp8j7riz-shepherd-host-name.scm.drv
  /gnu/store/84s79rcr5jmnic4ky4c6adg95n4kva2j-shepherd-host-name.go.drv
  /gnu/store/x8ww5ib04v06jm83qjd5pkaddp79f001-shepherd.conf.drv
  /gnu/store/jfnn59d6vqpx1n3rv8x4g72svmb877ri-boot.drv
  /gnu/store/yk1y0kpng1sc7yn2dz8rvnfb0v24561b-system.drv
  /gnu/store/jsrdys85vlbydp1sms2ch9xkyj8d9i98-parameters.drv
  /gnu/store/07lf5bzlk1lms6y2mp25z7460z504z8r-system.drv
  /gnu/store/72x0nyw9m54hsc1grskzmpfs54ymm6hf-grub.cfg.drv

building /gnu/store/6f5bq5hxm2gx04qd4frw1qmddidp80hh-provenance.drv...
building /gnu/store/f115kngj8fyymi5gpqn03fmiqrn0w33a-etc.drv...
building /gnu/store/q8ni4qmjqwr87rw3mqffma4kys5rw7sr-init.drv...
building /gnu/store/04qiqbqh0v1vkg32d8pq8f863raygalq-activate-service.scm.drv...
building /gnu/store/svb9q5i0w0xmc4gk3028m2dqi76qhra8-raw-initrd.drv...
building /gnu/store/2dabf6vlbj6kvdh7b7wcxldn8ak9rafy-activate.scm.drv...
building /gnu/store/89hrfinkj8sa1aizvl3wmqqlhfvqngj8-combined-initrd.drv...
building /gnu/store/zsslwylhfhxb4pld9ay6pg48lp8j7riz-shepherd-host-name.scm.drv...
building /gnu/store/gl7wzay96b4ynzn1acxwpmgvsavmf6f5-parameters.drv...
building /gnu/store/jsrdys85vlbydp1sms2ch9xkyj8d9i98-parameters.drv...
building /gnu/store/84s79rcr5jmnic4ky4c6adg95n4kva2j-shepherd-host-name.go.drv...
building /gnu/store/j0j1avdy377nvh4f93x05j65wjmprklc-shepherd-swap-cokolwiek-swap.scm.drv...
building /gnu/store/4harprlmnjsfgqwkkvi2h52ym4ay0s7n-shepherd-swap-cokolwiek-swap.go.drv...
building /gnu/store/x8ww5ib04v06jm83qjd5pkaddp79f001-shepherd.conf.drv...
building /gnu/store/jfnn59d6vqpx1n3rv8x4g72svmb877ri-boot.drv...
building /gnu/store/07lf5bzlk1lms6y2mp25z7460z504z8r-system.drv...
building /gnu/store/yk1y0kpng1sc7yn2dz8rvnfb0v24561b-system.drv...
building /gnu/store/72x0nyw9m54hsc1grskzmpfs54ymm6hf-grub.cfg.drv...
/gnu/store/n988yf5wsahxgn7xjl12zvk1rdd0m7br-system
/gnu/store/91fybdq9279mcym1d77jfdnkzjs1plsp-grub.cfg

initializing operating system under '/mnt'...
kopiowanie do '/mnt'...
populating '/mnt'...
substitute: looking for substitutes on 'http://192.168.10.3:8080'... 100.0%
substitute: looking for substitutes on 'https://substitutes.nonguix.org'... 100.0%
substitute: looking for substitutes on 'https://nonguix-proxy.ditigal.xyz/'... 100.0%
substitute: looking for substitutes on 'https://bordeaux.guix.gnu.org'... 100.0%
The following derivations will be built:
  /gnu/store/icknvjnsa5p9x3k9dl3bj411b6xndpy9-module-import.drv
  /gnu/store/z60dy97dz6majxf84gylhk50w965drji-module-import.drv
  /gnu/store/2afjsb4xbdggflrcq0x9gk3kfbjjia1m-install-bootloader.scm.drv

1,3 MB will be downloaded
 module-import-compiled  625KiB                                                                                         1.2MiB/s 00:00 ▕██████████████████▏ 100.0%
 module-import-compiled  625KiB                                                                                         1.2MiB/s 00:01 ▕██████████████████▏ 100.0%
building /gnu/store/icknvjnsa5p9x3k9dl3bj411b6xndpy9-module-import.drv...
building /gnu/store/z60dy97dz6majxf84gylhk50w965drji-module-import.drv...
building /gnu/store/2afjsb4xbdggflrcq0x9gk3kfbjjia1m-install-bootloader.scm.drv...
guix system: bootloader pomyślnie zainstalowany na /dev/sda

ZROBIONE Udało mi się po raz kolejny zapomnieć ustawić hasło na koncie administracyjnym. Powinienem ustawić uniwersalne hasło początkowe w części wspólnej konfiguracji systemów.

$ sudo chroot /mnt

root@mcdowell /# passwd marek

New password:
Retype new password:
passwd: hasło zostało zmienione