talks: Add talk by Gábor.

This commit is contained in:
Ludovic Courtès 2018-05-14 10:43:32 +02:00
parent b316205c39
commit 28bd2073ae
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
5 changed files with 482 additions and 0 deletions

View File

@ -0,0 +1 @@
../../fsf-hu-talk-2018/images/GuixSD-horizontal-print.pdf

View File

@ -0,0 +1 @@
../../fsf-hu-talk-2018/images/GuixSD.pdf

Binary file not shown.

View File

@ -0,0 +1,87 @@
[duration]
21
[notes_position]
RIGHT
[last_minutes]
3
[end_user_slide]
14
[notes]
### 1
### 2
Itt az első követelmény lazítható, úgy, hogy ekvivalens bemenetetek esetén ekvivalens kimeneteket várunk el.
A második követelmény valójában annyi, hogy perzisztens adatszerkezetben tároljuk az eredményeket.
A gyakorlati megvalósításokban irányított aciklikus gráfot használunk.
A cél az, hogy ha szükséges, akkor egy tetszőleges verziót újra elő lehessen állítani. Az adatszerkezetben csak konzisztens állapotoknak megfelelő konfigurációt tárolunk.
Ez egy node esetén nem okoz problémát, de nagyobb deployment esetén ezt így nem lehet csinálni.
Olyan módszerek is kellenek, amik ellenőzik, hogy az állapot valóban összeegyeztethető a tárolt gráffal.
### 3
Például frissítés közben megszűnik az áramellátás, vagy egyszerűen valamelyik csomag frissítésekor hiba lép fel. A régi csomag függőségek már eltávolításra kerültek, esetleg maga a régi csomag is, az új csomagot pedig nem sikerült feltelepíteni. Ez azt jelenti, hogy az adott csomag funkcionalitása nem elérhető. A legsúlyosabb esetekben ez akár bootolhatatlan rendszert is eredményezhet.
Ugyanez az időablak a nix és guix esetében egy symlink atomikus átváltására szűkül. Ha ez nem sikerül, akkor egyszerűen annyi történik, hogy a régi rendszeren maradunk.
A nix és guix semmi olyan szoftvert nem töröl, ami valaha a rendszeren telepítve volt, erre kifejezetten kérni kell. Ilyen esetben a csomagkezelő azokat a szoftvereket törli, amelyekről bizonyítani tudja, hogy azt más szoftver a rendszeren nem használja. Lehetőség van bizonyos szoftvereket megjelölni, hogy használatban vannak, így lehet kezelni a nem guix-el telepített szoftverek függőségeit, amiről a guix nem tudhat. Jobb módszer, ha lehetséges guix csomagot készíteni, mert így rendszeren belülre hozzuk a függőségeket.
A nixos és guixsd konfiguráció központosítja a konfigurációkezelést, és a GuixSD esetében lehetővé teszi a konfigurációs függőségek megvilágítását is (Shepherd service extension).
Fontos alap feltételezés, hogy a központi csomagkezelés csak akkor működik, ha mindent nix-el/guix-el csomagolunk.
### 4
A bitről bitre reprodukálhatóságnak rengeteg előnye van. Az egyik legfontosabb, hogy helyi újrafordítással az eredményt összehasonlítva meggyőződehetünk róla, hogy a csomagot ugyanúgy állították elő, mint ahogy mi tennénk.
Ezen felül lehetőséget biztosít a helyettesítőcsomagok hash alapján történő azonosítására.
Szintén lehetőséget ad arra, hogy a központi tároló tartalomcímezhető legyen. Ebben az esetben kialakítható zero trust architektúra, hiszen bárhonnan letöltve a helyetttesítőcsomagot, biztosak lehetünk benne, hogy tényleg ugyanazt a szoftvert futtatjuk, nem vagyunk ráutalva arra, hogy megbízzunk a helyettesítőket biztosító szerverben.
### 5
Ez egy nix kifejezés. Ez a nix csomagdefiníciós nyelve.
Alapvetően egy haskell típusú nyelv, némi bash szkripttel vegyítve.
Ez egy külső DSL, saját ad-hoc szintaxisa van, és külön értelmező kell hozzá.
Ezeket a kifejezéseket host side kódnak hívják.
A build side kód c++.
Külön repositoryban kezelik a host és build side kódokat.
### 6
Ez egy guix csomagdefiníció.
A nyelv egy belső DSL, a hostnyelv a guile scheme.
A nyelvet g-exp-nek nevezik. A scheme a define-syntax konstrukciójával különösen alkalmas belső DSL-ek definiálására, amik teljes mértékben olyan érzést eredményeznek a programozás során, mintha eleve a nyelv részét képeznék.
A host side és build side kód ugyanabban a repoban van, és guile scheme nyelven íródott.
Az egyetlen olyan rész ami még mindig C++ az a daemon. Jelenleg folyamatban van az újraimplementálása schemeben.
### 7
A GuixSD egy teljes mértékben GNU FSDG-vel kompatibilis disztribúció.
Ez a hivatalos GNU disztribúció.
A GNU Guix a GNU hivatalos csomagkezelője.
A GNU Guile scheme a GNU hivatalos kiterjesztési nyelve.
### 8
Ezen kívül lehetőség van minden felhasználó számára tetszőleges profilokat definiálni, és bármelyik profil bármelyik generációjára váltani.
Szintén lehetőség van profil manifesteket készíteni, ami lehetővé teszi például a csomagok verzióinak kötését.
Lehetőség van egyszerű parancssori argumentumokkal a szoftver patchelt vezióinak fordítása a tesztelési fázisban.
A csomagkezelő nyelv lehetővé teszi a csomag örököltetését egy másik csomagból, ami azt jelenti, hogy kisebb variánsok, például egy patchelt verzió, vagy egy olyan, amin nem futtatjuk le a teszteket, esetleg más konfigurációs flagekkel, vagy bemenetekkel fordítunk csak néhány sor.
### 9
Itt fontos megjegyezni, hogy milyen mértékben lehet azt funkcionálissá tenni. A GuixSD itt egy elég extrém irányt vett, a funkcionális működéshez szükséges dologkat a lehető legkorábban, már az initrd-ben betölti.
Tulajdonképpen így a bootloader és a kernel parancssor kerül ki a funkcionális konfiguráció keretei közül.
Ezen kívül jelenleg a rendszertelepítés nem funkcionális, elsősorban nincs funkcionális particionáló nyelv.
Tehát itt fordulhatnak még elő inkonzisztenciák.
Jelenleg igyekszünk, hogy lehetőséget biztosítsunk a rendszertelepítés funkcionálissá tételére, illetve a bootloader konfiguráció és a kernel command-line monitorozására.

View File

@ -0,0 +1,393 @@
\documentclass{beamer}
\usetheme{default}
\usefonttheme{structurebold}
\usepackage{helvet}
\usecolortheme{seagull} % white on black
\usepackage[utf8]{inputenc}
\PassOptionsToPackage{hyphens}{url}\usepackage{hyperref,xspace,multicol}
\usepackage[absolute,overlay]{textpos}
\usepackage{tikz}
\usetikzlibrary{arrows,shapes,trees,shadows,positioning}
\usepackage{fancyvrb} % for \Verb
\usepackage{pgfpages}
\setbeameroption{show notes on second screen=right}
% Remember the position of every picture.
\tikzstyle{every picture}+=[remember picture]
\tikzset{onslide/.code args={<#1>#2}{%
\only<#1>{\pgfkeysalso{#2}} % \pgfkeysalso doesn't change the path
}}
% Colors.
\definecolor{guixred1}{RGB}{226,0,38} % red P
\definecolor{guixorange1}{RGB}{243,154,38} % guixorange P
\definecolor{guixyellow}{RGB}{254,205,27} % guixyellow P
\definecolor{guixred2}{RGB}{230,68,57} % red S
\definecolor{guixred3}{RGB}{115,34,27} % dark red
\definecolor{guixorange2}{RGB}{236,117,40} % guixorange S
\definecolor{guixtaupe}{RGB}{134,113,127} % guixtaupe S
\definecolor{guixgrey}{RGB}{91,94,111} % guixgrey S
\definecolor{guixdarkgrey}{RGB}{46,47,55} % guixdarkgrey S
\definecolor{guixblue1}{RGB}{38,109,131} % guixblue S
\definecolor{guixblue2}{RGB}{10,50,80} % guixblue S
\definecolor{guixgreen1}{RGB}{133,146,66} % guixgreen S
\definecolor{guixgreen2}{RGB}{157,193,7} % guixgreen S
\setbeamerfont{title}{size=\huge}
\setbeamerfont{frametitle}{size=\huge}
\setbeamerfont{normal text}{size=\Large}
% White-on-black color theme.
\setbeamercolor{structure}{fg=guixorange1,bg=black}
\setbeamercolor{title}{fg=white,bg=black}
\setbeamercolor{date}{fg=guixorange1,bg=black}
\setbeamercolor{frametitle}{fg=white,bg=black}
\setbeamercolor{titlelike}{fg=white,bg=black}
\setbeamercolor{normal text}{fg=white,bg=black}
\setbeamercolor{alerted text}{fg=guixyellow,bg=black}
\setbeamercolor{section in toc}{fg=white,bg=black}
\setbeamercolor{section in toc shaded}{fg=white,bg=black}
\setbeamercolor{subsection in toc}{fg=guixorange1,bg=black}
\setbeamercolor{subsection in toc shaded}{fg=white,bg=black}
\setbeamercolor{subsubsection in toc}{fg=guixorange1,bg=black}
\setbeamercolor{subsubsection in toc shaded}{fg=white,bg=black}
\setbeamercolor{frametitle in toc}{fg=white,bg=black}
\setbeamercolor{local structure}{fg=guixorange1,bg=black}
\newcommand{\highlight}[1]{\alert{\textbf{#1}}}
\title{Funkcionális csomagkezelés}
\subtitle{Szabad Szoftver Konferencia 2018}
\author{Boskovits Gábor}
\date{\small{2018. május 12., Budapest, Magyarország}}
\setbeamertemplate{navigation symbols}{} % remove the navigation bar
\AtBeginSection[]{
\begin{frame}
\frametitle{}
\tableofcontents[currentsection]
\end{frame}
}
\newcommand{\screenshot}[1]{
\begin{frame}[plain]
\begin{tikzpicture}[remember picture, overlay]
\node [at=(current page.center), inner sep=0pt]
{\includegraphics[width=\paperwidth]{#1}};
\end{tikzpicture}
\end{frame}
}
\begin{document}
\maketitle
\setbeamercolor{normal text}{fg=white,bg=black}
\begin{frame}[fragile]
\frametitle{Mi a funkcionális csomagkezelés?}
Egy sikeres csomagkezelési művelet eredménye csak a művelet bemeneteitől függ,
az állapottól független.
\begin{itemize}
\item A fordítási folyamat: tiszta függvény.
\item A lefordított szoftver: perzisztens gráf.
\end{itemize}
Az elméleti hátteret lásd:
Eelco Dolstra. The Purely Functional Software Deployment Model.
PhD thesis, Faculty of Science, Utrecht, The Netherlands.
January 2006. ISBN 90-393-4130-3.
% \note{20 perc}
\end{frame}
\begin{frame}[fragile]
\frametitle{Mi a probléma a jelenlegi modellel?}
\scriptsize{
\begin{enumerate}
\item A frissítések és konfiguráció változtatások nehezek, gyakran nem tudunk
visszatérni az előző jó konfigurációhoz, előfordulhat, hogy egy sikertelen
csomagkezelési műveletet követően a rendszer inkonzisztens állapotba kerül
\item Több csomagkezelési és konfigurálási művelet után követhetetlenné válik
a rendszer pillanatnyi állapota, lehetséges, hogy két rendszer, amelyeknek
ugyan abban az állapotban kellene lennie mégis különböző állapotba kerül
\item A konfiguráció szét van tördelve, gyakran még az sem világos, hogy egy
adott szoftver működését melyik konfigurációs beállítások befolyásolják,
nincs központi konfiguráció kezelés
\item A csomagok elérhetőségi és telepítési információi szét vannak tördelve,
nagyrészt a nyelvspecifikus csomagkezelőknek köszönhetően, nem áttekinthető,
hogy egyáltalán milyen csomagok vannak egy adott rendszeren telepítve, nincs
központi csomagkezelés
\item Ezeknek a töredezett csomag és konfigurációs adatoknak köszönhetően
nincs megfelelő függőségi információnk a rendszerről
\end{enumerate}
}
\end{frame}
\begin{frame}[fragile]
\frametitle{A funkcionális csomagkezelők alapvető működése}
Jelenleg két funkcionális csomagkezelőt ismerünk, ezek a
Nix és a Guix.
A működés alapelve a következő: a programokat egy központi helyre telepítik,
minden programnak külön izolált telepítési fája van. Ezek a megfelelő
helyekre, például a felhasználók profiljaiba szimbolikus linkekkel kerülnek
becsatolásra. A központi tárolóhoz csak egy rendszergazdai jogosultságokkal
rendelkező szolgáltatás férhet hozzá. A szoftver fordítás izolált
környezetben történik, és csak a csomagleírásban kifejezetten bemenetként
említett csomagok állnak rendelkezésre a fordítási környezetben. A cél, hogy
az eredmény bitről bitre reprodukálható legyen.
\end{frame}
\begin{frame}[fragile]
\frametitle{Csomagdefiníció példa - Nix}
\tiny{
\begin{verbatim}
{ stdenv, fetchurl }:
stdenv.mkDerivation rec {
name = "hello-2.10";
src = fetchurl {
url = "mirror://gnu/hello/${name}.tar.gz";
sha256 = "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i";
};
doCheck = true;
meta = {
description = "A program that produces a familiar, friendly greeting";
longDescription = ''
GNU Hello is a program that prints "Hello, world!" when you run it.
It is fully customizable.
'';
homepage = http://www.gnu.org/software/hello/manual/;
license = stdenv.lib.licenses.gpl3Plus;
maintainers = [ stdenv.lib.maintainers.eelco ];
platforms = stdenv.lib.platforms.all;
};
}
\end{verbatim}
}
\end{frame}
\begin{frame}[fragile]
\frametitle{Csomagdefiníció példa - Guix}
\tiny {
\begin{verbatim}
(define-module (gnu packages hello)
#:use-module (guix packages)
#:use-module (guix download)
#:use-module (guix build-system gnu)
#:use-module (guix licenses)
#:use-module (gnu packages gawk))
(define-public hello
(package
(name "hello")
(version "2.10")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/hello/hello-" version
".tar.gz"))
(sha256
(base32
"0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i"))))
(build-system gnu-build-system)
(arguments '(#:configure-flags '("--enable-silent-rules")))
(inputs `(("gawk" ,gawk)))
(synopsis "Hello, GNU world: An example GNU package")
(description "Guess what GNU Hello prints!")
(home-page "http://www.gnu.org/software/hello/")
(license gpl3+)))
\end{verbatim}
}
\end{frame}
\begin{frame}[fragile]
\frametitle{Különbségek a Guix és a Nix között}
Két fontos különbséget kell megemlítenünk:
\begin{enumerate}
\item Míg a Nix egy külső DSL mellett tette le a voksát, addig a Guix egy
belső DSL-t válaszott. Ez lehetővé teszi a Guix esetében a fogadó
programnyelv lehetőségeinek teljes körű kihasználását.
\item A másik különbség filozófiai jellegű, a Guix nem támogatja a nem
szabad szoftvereket, a hivatalos csomagadatbázisokban csak szabad szoftver
található. Ez nem jelenti azt, hogy ilyen szoftver nem használható vagy
csomagolható Guix-el, de ezek a csomagok nem kerülhetnek be a hivatalos
repoba.
\end{enumerate}
\end{frame}
\begin{frame}[fragile]
\frametitle{A Guix parancssor rövid bemutatása}
\begin{itemize}
\item guix package -r lua -u guile emacs -i guile-cairo@1.9.91 : egy
tranzakcióban törölje a lua, frissítse a guile,emacs és telepítse a
guile-cairo csomag 1.9.91-es verzióját. Ha ebből bármi nem sikerül, a
rendszer az eredeti állapotában marad.
\item guix package --roll-back : A legutóbbi csomagkezelési tranzakció
visszavonása
\item guix package -s emacs : Keressen információt az adott csomagokról
\item guix pull : A Guix frissítése
\item guix environment guix --ad-hoc git strace : Hozzon létre egy fejlesztői
környezetet a guix csomaghoz, amiben a git és az strace is rendelkezésre áll
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Funkcionális rendszerkonfiguráció}
A funkcionális csomagkezelés természetesnek tűnő kiterjesztése a funkcionális
rendszerkonfiguráció. Erre mindkét csomagkezelőnek van megoldása, a NixOS és
a GuixSD disztribúciók. Ezek a Nix illetve Guix csomagkezelőt használják, és
kiegészítik egy rendszerkonfigurációs nyelvvel, illetve ehhez tartozó
felhasználói felületek, ami a Guix esetében a guix system parancs.
Előnyei:
\begin{itemize}
\item konfigurálható és kiterjeszthető rendszerszolgáltatások
\item tranzakcionális frissítés/visszaállítás
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Rendszerkonfiguráció - GuixSD}
\scriptsize {
\begin{verbatim}
(operating-system
(host-name "schememachine")
(timezone "Japan")
(locale "ja_JP.utf8")
(bootloader (grub-configuration (device "/dev/sda")))
(file-systems (cons (file-system
(device "my-root")
(title 'label)
(mount-point "/")
(type "ext4"))
%base-file-systems))
(users (cons (user-account
(name "alice")
(group "users")
(home-directory "/home/alice"))
%base-user-accounts))
(services (cons* (dhcp-client-service)
(lsh-service #:port-number 2222)
%base-services)))
\end{verbatim}
}
\end{frame}
\begin{frame}[fragile]
\frametitle{A guix system bemutatása}
\begin{itemize}
\item guix system reconfigure file: a rendszer újrakonfigurálása a fájlban
szereplő konfiguráció alapján
\item guix system roll-back: a rendszer visszaállítása az előző konfigurációra
\item guix system vm file: rendszer indítása az adott konfigurációval
virtuális gépben
\item guix system container file: rendszer indítása az adott konfigurációval
konténerben
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{NixOps, Upcast}
A következő lépés a teljes többgépes telepítések funkcionálissá tétele. Itt még
jelenleg elég sok a kihívás. A Nix csomagkezelőnek két megoldása van rá, a
hivatalos NixOps, és az Upcast. A NixOps egy sqlite adatbázisban tárolja a
telepítés állapotát, míg az Upcast erre egy szöveges fáljt használ, ami olyan
szempontból jobb, hogy verziókövetés alá lehet vonni. A Guix közösség még
keresi a megoldásokat a felmerülő problémákra, így a Guix-nek erre még nincs
kész megoldása.
\end{frame}
\begin{frame}[fragile]
\frametitle{Guix továbbfejlesztési tervek}
\begin{itemize}
\item szoftvercsatornák - tervezés alatt
\item több gépes telepítések - tervezés alatt
\item teljes forráskód alapú bootstrap útvonal - fejlesztés alatt
\item grafikus telepítő - fejlesztés alatt
\item build farm webfelület - fejlesztés alatt (GSoC)
\item systemd kompatibilitás - feljlesztés alatt (GSoC)
\item a daemon úrjaimplementálás scheme-ben - fejlesztés alatt (GSoC)
\item barátságosabb kimenet - fejlesztés alatt (Outreachy)
\end{itemize}
\end{frame}
\begin{frame}{A Guix és GuixSD közösség szívesen veszi a segítéget}
\vspace{0.7cm}
\large{
\begin{itemize}
\item minél többen telepítik és használják a Guix-et, annál jobb
felhasználói élményt tud nyújtani
\item a fejlesztők számára a hibajelentések és kérdések nagyon sokat
jelentenek, így tudják a Guix-et még jobbá tenni
\item a közösség számára fontos, hogy a felhasználóik és az újonnan
csatlakozó fejlesztők megosszák az ötleteiket, hiszen így lehet
a Guix-et új, hasznos funkciókkal bővíteni
\end{itemize}
}
\end{frame}
\begin{frame}[fragile]
\vfill{
\vspace{2.5cm}
\center{\includegraphics[width=0.3\textwidth]{images/GuixSD}}\\[1.0cm]
\texttt{boskovits@gmail.com}\hfill{\alert{\url{https://gnu.org/software/guix/}}}
}
\end{frame}
\begin{frame}[fragile]
\begin{textblock}{12}(2, 8)
\tiny{
Copyright \copyright{} 2010, 2012--2016 Ludovic Courtès \texttt{ludo@gnu.org}.\\[3.0mm]
Copyright \copyright{} 2018 Gábor Boskovits \texttt{boskovits@gmail.com}.\\[3.0mm]
GNU GuixSD logo, CC-BY-SA 4.0, \url{https://gnu.org/s/guix/graphics}
Copyright of other images included in this document is held by
their respective owners.
\\[3.0mm]
This work is licensed under the \alert{Creative Commons
Attribution-Share Alike 3.0} License. To view a copy of this
license, visit
\url{http://creativecommons.org/licenses/by-sa/3.0/} or send a
letter to Creative Commons, 171 Second Street, Suite 300, San
Francisco, California, 94105, USA.
\\[2.0mm]
At your option, you may instead copy, distribute and/or modify
this document under the terms of the \alert{GNU Free Documentation
License, Version 1.3 or any later version} published by the Free
Software Foundation; with no Invariant Sections, no Front-Cover
Texts, and no Back-Cover Texts. A copy of the license is
available at \url{http://www.gnu.org/licenses/gfdl.html}.
\\[2.0mm]
% Give a link to the 'Transparent Copy', as per Section 3 of the GFDL.
The source of this document is available from
\url{http://git.sv.gnu.org/cgit/guix/maintenance.git}.
}
\end{textblock}
\end{frame}
\end{document}