\documentclass[aspectratio=43]{beamer}
\usetheme{simple}
\usepackage{lmodern}
\usepackage[scale=2]{ccicons}
\usepackage{hyperref}
\usepackage[inkscapeformat=png]{svg}
\usepackage[utf8]{inputenc} % No olvides utilizar UTF8, especialmente si tu presentación está en castellano
\def\edicion{XXXV} % Edición de las jornadas
\def\fecha{Abril 2023} % Fecha de las jornadas
\title{NixOS} % Modifica el título de la presentación a tu gusto
\subtitle{Linux dentro de 10 años} % Incluye un subtítulo si lo ves necesario, o bórralo
\author{Manuel Palenzuela Merino} % Cambia el autor de la presentación
\twitter{github.com/Baitinq} % Pon tu Twitter o déjalo en blanco
% Esto no lo cambies
\institute{\edicion \ Jornadas Técnicas del GUL}
\date{\fecha}
% Página principal (no tocar)
\titlegraphic{img/logo1.png}
\begin{document}
{
\setbeamertemplate{footline}{}
\begin{frame}
\titlepage
\end{frame}
}
\addtocounter{framenumber}{-1}
\setwatermark{\includegraphics[height=8cm]{img/logo1.png}} % Marca de agua (opcional)
\section{Distribuciones de Linux "tradicionales"}
\subsection{Problemas}
\section{Que es Nix?}
\section{Nix (Lenguaje)}
\subsection{Derivaciones}
\section{Nixpkgs}
\section{Nix (Package Manager)}
\section{NixOS}
\subsection{Highlights}
\subsection{Configuraciones}
\section{El futuro de Linux}
\subsection{Mas informacion}
\section{Preguntas}
% ------------------------------------------------------------------------------------------
% La presentación empieza aquí. La primera diapositiva puede dejarse tal cual o sustituirse.
% ------------------------------------------------------------------------------------------
\begin{frame}
\frametitle{Antes de empezar}
\begin{enumerate}
\item{Podeis preguntar dudas en cualquier momento}
\item{Cuantas mas preguntas mejor :))}
\item{Tambien se aceptan sugerencias durante la charla (mas alto, explicar algo mas a fondo, etc)}
\item{\href{https://github.com/Baitinq/nixos-presentation}{https://github.com/Baitinq/nixos-presentation}}
\end{enumerate}
\end{frame}
\begin{frame}
\frametitle{Tabla de contenidos} % Puedes ponerle un título más chulo a la diapositiva con el índice de contenidos o dejar éste
\tableofcontents % Para poblar la tabla de contenidos debes utilizar \section y \subsection apropiadamente (ver demo)
\end{frame}
\begin{frame}
\frametitle{Distribuciones de Linux "tradicionales"}
\begin{columns}
\column{0.4\textwidth}
Ej:
\begin{itemize}
\item{Arch Linux}
\item{Debian}
\item{Fedora}
\item{Ubuntu}
\end{itemize}
\column{0.4\textwidth}
Que son:
\begin{enumerate}
\item Package manager
\item Repositorios
\item Filesystem structure
\item Etc?
\end{enumerate}
\end{columns}
\end{frame}
% TODO: Do sections in table of contents
\begin{frame}
\frametitle{Problemas de distros "tradicionales"}
\begin{itemize}
\item Actualizaciones/cambios de configuración modifican destructivamente el estado del sistema (sobrescribiendo archivos en secuencia -\> \textbf{inconsistencia temporal})
\item Diferentes versiones de un binario
\item Conflictos de paquetes
\item No hay rollbacks
\item No hay gestión de la configuración (dotfiles)
\item\textbf{NO HAY DETERMINISMO}
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Que es Nix?}
\begin{enumerate}[I]
\item{\href{https://nix.dev/tutorials/nix-language}{Nix (lenguaje)}}
\item{\href{https://github.com/NixOS/nixpkgs}{Nixpkgs}}
\item{\href{https://github.com/NixOS/nix}{Nix (package manager)}}
\end{enumerate}
\end{frame}
\begin{frame}
\frametitle{Nix (Lenguaje)}
\begin{itemize}
\item Es un DSL (no un GPL!)
\item Usado para describir \textbf{derivaciones}
\item Dynamically typed (por el momento)
\item Lazy
\item Funcional (no hay side-effects)
\item Turing completo
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Nix (lenguaje)}
\begin{block}{}
\begin{verbatim}
let
nombre = "GUL";
saludar = x: "hola " + x + "!";
in {
x = saludar nombre;
z = 1;
}
\end{verbatim}
\end{block}
\begin{block}{}
\begin{verbatim}
nix-repl> { x = "hola GUL!"; z = 1; }
\end{verbatim}
\end{block}
\end{frame}
\begin{frame}[fragile]
\frametitle{Nix (lenguaje) - Derivaciones}
\begin{block}{}
\fontsize{10}{12}\begin{verbatim}
nix-repl> d = derivation { name = "myname"; builder ="mybuilder";
system = "mysystem"; }
nix-repl> d
«derivation /nix/store/z3hhlxbckx4g3n9sw91nnvlkjvyw754p-myname.drv»
\end{verbatim}
\end{block}
\begin{block}{hello.nix}
\begin{verbatim}
with import <nixpkgs> {};
stdenv.mkDerivation {
name = "hello";
src = ./hello-2.10.tar.gz;
}
\end{verbatim}
\end{block}
\begin{block}{}
\fontsize{10}{12}\begin{verbatim}
$ nix-build hello.nix
/nix/store/6y0mzdarm5qxfafvn2zm9nr01d1j0a72-hello
$ /nix/store/6y0mzdarm5qxfafvn2zm9nr01d1j0a72-hello/bin/hello
Hello, world!
\end{verbatim}
\end{block}
\end{frame}
\begin{frame}
\frametitle{Nixpkgs (the Nix packages collection)}
\begin{itemize}
\item Repositorio en GitHub (Licencia FOSS)
\item Contiene definiciones de paquetes (derivations)
\item Tambien contiene tests, librerias, etc.
\item Ramas diferentes (rolling: master, stable: release-YY.MM)
\item Compilado y testeado por Hydra (+=y subido al cache binario)
\end{itemize}
\vspace{14}
\begin{itemize}
\item Numero de paquetes $\Rightarrow$ nixpkgs-unstable: \textbf{82918} vs AUR: \textbf{72357}
\item Puesto numero \textbf{12} en lenguajes mas populares en GitHub (en cuanto a PRs)
\end{itemize}
\end{frame}
\begin{frame}
\includesvg[scale=0.4]{img/map_repo_size_fresh.svg}
\end{frame}
\begin{frame}[fragile]
\begin{block}{aircrack-ng.nix}
\fontsize{7}{9}\begin{verbatim}
{ lib, stdenv, fetchurl, libpcap, openssl, zlib, wirelesstools
, iw, ethtool, pciutils, libnl, usbutils }:
stdenv.mkDerivation {
pname = "aircrack-ng";
version = "1.7";
src = fetchurl {
url = "https://download.aircrack-ng.org/aircrack-ng-${version}.tar.gz";
sha256 = "1hsq1gwmafka4bahs6rc8p98yi542h9a502h64bjlygpr3ih99q5";
};
buildInputs = [ libpcap openssl zlib libnl iw ethtool pciutils ];
[...]
meta = with lib; {
description = "Wireless encryption cracking tools";
homepage = "http://www.aircrack-ng.org/";
license = licenses.gpl2Plus;
maintainers = with maintainers; [ ];
platforms = platforms.linux;
};
}
\end{verbatim}
\end{block}
\end{frame}
\begin{frame}[fragile]
\frametitle{Nix (package manager)}
\begin{itemize}
\item Un gestor de paquetes puramente funcional (y deterministico)
\item Instalación de paquetes por usuarios sin privilegios
\item Guarda los paquetes en la Nix store (/nix/store por defecto)
\item Cada paquete tiene su propio UUID (/nix/store/\$hash\$version\$name)
\item Permite instalar diferentes versiones de un mismo paquete
\item Elimina totalmente problemas de dependencias
\item Actualizaciones y rollbacks \textbf{atomicos}
\item Instalable en cualquier distro + MacOS (homebrew replacement?)
\end{itemize}
\begin{block}{Ejemplos:}
\begin{verbatim}
$ nix-env -i aircrack-ng
$ nix run vim
$ nix run "github:example/repo#package"
$ nix shell blender-bin#blender_2_83
\end{verbatim}
\end{block}
\end{frame}
\begin{frame}
\frametitle{NixOS}
\begin{center}
Integra profundamente Nix (los 3 tipos) en una distribucion de Linux!
\end{center}
\vspace{20}
\begin{center}
\includegraphics[scale=0.1]{img/1280px-NixOS_logo.svg.png}
\end{center}
\end{frame}
%TODO: IMAGES
\begin{frame}
\frametitle{NixOS Highlights}
\begin{itemize}
\item Actualizaciones atomicas (software & configuration)
\item Actualizaciones fiables (y rollbacks - configuración vinculada a la versión de software correcta + recargas/reinicios del servicio)
\item Rollbacks
\item Reproducible
\item Configuracion del OS \textbf{declarativa}
\begin{itemize}
\item TODO tu sistema operativo en un repositorio git
\end{itemize}
\item \textbf{DETERMINISMO}
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Mi Configuracion}
\includegraphics[scale=0.34]{img/20230413_10h27m54s_grim.png}
\end{frame}
\begin{frame}[fragile]
\frametitle{Configuracion minima de NixOS}
\begin{block}{configuration.nix}
\begin{verbatim}
{
boot.loader.grub.device = "/dev/sda";
fileSystems."/".device = "/dev/sda1";
services.sshd.enable = true;
}
\end{verbatim}
\end{block}
\begin{block}{}
\begin{verbatim}
$ nixos-rebuild switch -I nixos-config=configuration.nix
$ nixos-rebuild switch --rollback
$ nixos-rebuild test -I nixos-config=configuration.nix
$ nixos-rebuild build-vm -I nixos-config=configuration.nix
\end{verbatim}
\end{block}
\end{frame}
\begin{frame}[fragile]
\frametitle{Configuraciones NixOS}
\begin{block}{configuration.nix}
\fontsize{9}{11}\begin{verbatim}
{ config, pkgs, ...} :
{
imports = [ ./hardware.nix ];
environment.systemPackages = with pkgs; [ thunderbird firefox vim ];
users.users."alice" = {
isNormalUser = true;
home = "/home/alice";
extraGroups = [ "wheel" "networkmanager" ];
};
services.xserver = {
windowManager.i3.enable = true;
displayManager.sddm.enable = true;
videoDrivers = [ "nvidia" ];
};
networking.firewall.enable = true;
}
\end{verbatim}
\end{block}
\end{frame}
\begin{frame}
\frametitle{El futuro de Linux}
\begin{itemize}
\item NixOS tiene problemas
\item Alternativas:
\begin{itemize}
\item Fedora Silverblue?
\item Seguir como estamos?
\end{itemize}
\end{itemize}
\begin{center}
\includegraphics[scale=0.34]{img/1366_2000.jpg}
\end{center}
\end{frame}
\begin{frame}
\frametitle{Mas informacion}
\begin{center}
\begin{itemize}
\item \begin{center}NixOS modules\end{center}
\item \begin{center}Overriding\end{center}
\item \begin{center}Flakes\end{center}
\item \begin{center}Etc..\end{center}
\end{itemize}
\end{center}
\begin{columns}
\column{0.6\textwidth}
\begin{itemize}
\item \href{https://nixos.org}{NixOS website}
\item \href{https://nixos.org/manual/nixos/stable/}{Nix Manuals}
\item \href{https://nixos.org/guides/nix-pills/}{\textbf{Nix Pills}}
\item \href{https://learnxinyminutes.com/docs/nix/}{Learn X in Y minutes, where X=nix}
\end{itemize}
\column{0.4\textwidth}
\includegraphics[scale=0.4]{img/207px-Home-nixos-logo.png}
\end{columns}
\end{frame}
\begin{frame}
\frametitle{Gracias por escuchar!}
\begin{center}
\includegraphics[scale=0.4]{img/207px-Home-nixos-logo.png}
\begin{itemize}
\item Preguntas
\item Feedback
\end{itemize}
\end{center}
\vspace{44}
\href{https://github.com/Baitinq/nixos-config}{https://github.com/Baitinq/nixos-config}
\end{frame}
\end{document}