From 34c39badf1ea35401233d97707f7f53ada8e9429 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Karel=20Ko=C4=8D=C3=AD?= <cynerd@email.cz>
Date: Mon, 15 Nov 2021 09:22:24 +0100
Subject: 2021-IT21.2: add presentation about Turris 3.x migration

---
 2021-IT21.2/pres.tex | 318 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 318 insertions(+)
 create mode 100644 2021-IT21.2/pres.tex

(limited to '2021-IT21.2/pres.tex')

diff --git a/2021-IT21.2/pres.tex b/2021-IT21.2/pres.tex
new file mode 100644
index 0000000..7327cd3
--- /dev/null
+++ b/2021-IT21.2/pres.tex
@@ -0,0 +1,318 @@
+\documentclass[aspectratio=169]{beamer}
+\usepackage{lmodern}
+\usepackage[czech]{babel}
+\usepackage[utf8x]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage{textpos}
+\usepackage{tikz,calc}
+\usepackage{graphicx}
+\usepackage{wrapfig}
+\usepackage{color}
+\usepackage{mathtools}
+\usepackage{hyperref}
+\usepackage{epstopdf}
+\usepackage{amsmath}
+\usepackage{minted}
+\hypersetup{
+	colorlinks,
+	citecolor=black,
+	filecolor=black,
+	linkcolor=black,
+	urlcolor=black
+}
+\usepackage{pdflscape}
+
+\input{theme/theme.tex}
+
+\title{Migrace z Turris OS 3.x}
+\author{Karel Kočí}
+\date{10.11.2021}
+
+\begin{document}
+
+\input{theme/title.tex}
+
+\begin{frame}{Migrace z Turris OS 3.x pro uživatele}
+	Dokumentace: https://docs.turris.cz/geek/tos3-migration/
+
+	\vspace{1cm}
+
+	\includegraphics[width=10cm]{migration.png}\\
+	S vydáním Turris OS 5.3.1..
+
+	\vspace{1cm}
+	Do konce roku spuštění automatické migrace ve vlnách.
+\end{frame}
+
+\begin{frame}{Proč je nutná migrace?}
+	Obrovské změny mezi lety 2016 a 2018.
+
+	Turris OS 3.x: OpenWrt 15.05 (poslední merge Leden 2016)
+
+	Turris OS 4.0: OpenWrt 18.06
+
+	\begin{itemize}
+		\item Velké změny v konfiguraci
+		\item Změna LibC na Turris 1.x
+		\item Změny v repozitářích (jiná dispozice)
+		\item Změny v balíčkách
+		\item Odstranění některých funkcionalit
+	\end{itemize}
+\end{frame}
+
+\begin{frame}{Konfigurace}
+	\begin{itemize}
+		\item Přechod od swconfig k DSA pro switch konfiguraci
+		\item Správa SFP v kernelu (chybějící přepínání za běhu)
+		\item Změna identifikace Wi-Fi karet
+		\item Přesun od UCI konfigurace k nativní pro sshd
+		\item Update LXC z 1.0 na 3.0 (4.0)
+		\item Přechod od uCollect k Sentinel
+	\end{itemize}
+
+	Spousta změn v druhotném softwaru..
+\end{frame}
+
+\begin{frame}[fragile]{Migrace konfigurace}
+	Balíček \textit{tos3to4} s migračními skripty.
+	Pro budoucí rozšiřitelnost v Turris OS 4.0+.
+
+	\begin{minted}[frame=lines]{bash}
+config_load wireless
+wifi_handle() {
+	local radio="$1"
+	config_get path "$radio" path
+	mac="$(cat /sys/devices/platform/"$path"/ieee80211/phy*/macaddress)"
+	uci set "wireless.$radio.macaddr=$mac"
+	uci delete "wireless.$radio.path"
+}
+config_foreach wifi_handle wifi-device
+uci commit wireless
+	\end{minted}
+\end{frame}
+
+\begin{frame}[fragile]{Offline aktualizace}
+	Nahrajeme nový systém, zmigrujeme konfiguraci a provedeme reboot...
+
+	\vspace{0.2cm}
+
+	Výhody:
+	\begin{itemize}
+		\item Jednoduché
+		\item Atomické díky BTRFS
+	\end{itemize}
+
+	\vspace{0.2cm}
+
+	Proč to nejde:
+	\begin{minted}[frame=lines]{lua}
+[ -n "$IPKG_INSTROOT" ] || {
+	package_migration
+}
+\end{minted}
+	⇒ Aktualizace za běhu
+\end{frame}
+
+\begin{frame}[fragile]{Trocha teorie... Updater}
+	Lua předpis/konfigurace z online zdrojů (updater lists).
+
+	\begin{minted}[frame=lines]{lua}
+Repository('turris/core', '../packages/core')
+Install('updater-ng', 'updater-supervisor', { critical = true })
+Package('updater-ng', { replan = 'finished' })
+\end{minted}
+\end{frame}
+
+\begin{frame}[fragile]{Trocha teorie... Package extras}
+	\begin{minted}[frame=lines]{lua}
+Package('updater-ng', { replan = 'finished' })
+\end{minted}
+
+	\begin{itemize}
+		\item \textbf{virtual}: k danému názvu balíčku neexistuje binární balíček
+		\item \textbf{deps}: dodatečné závislosti balíčku
+		\item \textbf{reboot}: \textit{delayed} vyžádá reboot a
+			\textit{finished} bezpodmínečně provede na konci transakce
+		\item \textbf{replan}: \textit{finished} způsobí znovu spuštění updateru
+			okamžitě po ukončení a \textit{immediate} způsobí to samé, ale
+			okamžitě o instalaci balíčku
+		\item \textbf{abi\_change} a \textbf{abichange\_deep} způsobí reinstalaci
+			všech závislých balíčků
+		\item \textbf{order\_before} a \textbf{order\_after} nikdy nefungovaly
+	\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]{První iterace aneb "tohle nebude fungovat"}
+	Balíček \textit{tos3to4} v Turris OS 3.x:
+	\begin{minted}[frame=lines]{lua}
+Script("https://repo.turris.cz/hbs/omnia/lists/migrate3x.lua", {
+	security = "Local", ca = system_cas, crl = no_crl,
+	pubkey = { "file:///etc/updater/keys/release.pub" }
+})
+\end{minted}
+
+	\textit{migrate3x.lua} na serveru:
+	\begin{minted}[frame=lines]{lua}
+Repository("turris", "https://repo.turris.cz/hbs/"..board.."/packages", {
+	priority = 60,
+	subdirs = { "base", "core", "packages", "turrispackages"}
+})
+\end{minted}
+\end{frame}
+
+\begin{frame}[fragile]{Druhá iterace aneb "update updater"}
+	\begin{minted}[frame=lines]{lua}
+if version_match(self_version, "<64.0") then
+  Repository("turris", "https://repo.turris.cz/hbs/"..board.."/packages", {
+    priority = 60,
+    subdirs = { "base", "core", "packages", "turrispackages"}
+  })
+  Install('updater-ng', { critical = true })
+  Package('updater-ng', {
+    replan = 'immediate',
+    deps = { 'libgcc', 'busybox', 'tos3to4-early' }
+  })
+end
+Package("libc", { abi_change_deep = true })
+\end{minted}
+\end{frame}
+
+\begin{frame}[fragile]{Updater: vítejte v pekle}
+	Kontrola kolizí...
+	\begin{minted}[frame=lines]{md}
+DIE: [string "transaction"]:334: [string "transaction"]:158: Collisions:
+• /usr/sbin/cron: vixie-cron (existing-file), cronie (new-file)
+\end{minted}
+
+	\vspace{0.4cm}
+
+	Dobře tak:
+	\begin{minted}[frame=lines]{lua}
+Package("cronie", { virtual = true })
+\end{minted}
+	\begin{minted}[frame=lines]{md}
+ERROR: inconsistent: Candidate exists for virtual package gettext-tools
+\end{minted}
+\end{frame}
+
+\begin{frame}[fragile]{Pokračování teorie... pořadí změn}
+	\begin{minted}[frame=lines]{lua}
+Install('updater-ng', { critical = true, priority = 50 })
+\end{minted}
+
+	Pravidla řazení, první v pořadí:
+	\begin{enumerate}
+		\item Závislý balíček na následujícím v pořadí
+		\item Balíček který má konflikt s následujícím v pořadí
+		\item Kriticky vyžádané balíčky
+		\item Priorita (vyšší hodnota znamená dřívější zařazení)
+		\item Instalace balíčku (odstranění se provádí až na konci)
+	\end{enumerate}
+	BTW, toto platí jen pro nové verze updateru.
+\end{frame}
+
+\begin{frame}[fragile]{Třetí iterace aneb "early later"}
+	\begin{minted}[frame=lines]{lua}
+  Package('updater-ng', {
+    replan = 'immediate',
+    deps = { 'libgcc', 'busybox' }
+  })
+else
+  if version_match(installed["tos3to4"].version, "<2.0.0") then
+    Install('tos3to4-early', { critical = true, priority = 100 })
+    Package('tos3to4-early', { replan = 'immediate' })
+  end
+end
+\end{minted}
+\end{frame}
+
+\begin{frame}[fragile]{Čtvrtá iterace aneb "ufff to trvá"}
+	OpenWrt používá Procd jako init systém, a ten komunikuje přes ubus.
+
+	Nová verze ubus nekomunikuje se starou a čeká na timeout dvě minuty.
+
+	\begin{minted}[frame=lines]{bash}
+[ -n "${IPKG_INSTROOT}" ] || {
+  ubus call system info 2>/dev/null >&2 || killall ubusd
+}
+\end{minted}
+
+	\begin{minted}[frame=lines]{lua}
+if version_match(installed["ubus"].version, "<2018") then
+  Package("ubus", { replan = 'immediate' })
+end
+\end{minted}
+\end{frame}
+
+\begin{frame}[fragile]{Pátá iterace aneb "chybí mi balík"}
+	\begin{minted}[frame=lines]{lua}
+Install("cups")
+\end{minted}
+
+	\begin{minted}[frame=lines]{md}
+ERROR: inconsistent: Requested package cups that is not available.
+\end{minted}
+
+	\vspace{0.2cm}
+
+	Po implementaci v updateru:
+	\begin{minted}[frame=lines]{lua}
+Mode("optional_installs")
+\end{minted}
+\end{frame}
+
+\begin{frame}[fragile]{Šestá iterace aneb "localrepo ach localrepo"}
+	Localrepo uchovává balíčky, které nebyly nainstalované z repozitáře.
+
+	Jo, ty které se neaktualizují, a rozhodně fungovat nebudou.
+
+	\begin{minted}[frame=lines]{bash}
+SOURCE="/usr/share/updater/localrepo"
+COLLIDED="/usr/share/updater/collided$SOURCE"
+mv "$SOURCE" "$COLLIDED"
+\end{minted}
+
+	\begin{minted}[frame=lines]{lua}
+  Package('updater-ng', {
+    replan = 'immediate',
+    deps = { 'libgcc', 'busybox', 'tos3to4-earliest' }
+  })
+else
+\end{minted}
+\end{frame}
+
+\begin{frame}[fragile]{Sedmá iterace aneb "brick"}
+	Po aktualizaci máme DSA nastavení, ale nemáme DSA v jádře..
+
+	\begin{minted}[frame=lines]{lua}
+Package("tos3to4", { reboot = "finished" })
+\end{minted}
+\end{frame}
+
+\begin{frame}[fragile]{Osmá iterace... no nic, to by bylo na dlouho}
+	Takže takový update vypadá takto:
+	\begin{enumerate}
+		\item Instalace \textit{tos3to4} v Turris OS 3.x
+		\item Aktualizace updateru na nejnovější verzi a instalace
+			\textit{tos3to4-earliest}
+		\item Aktualizace ubus (dvě minuty čekání)
+		\item Instalace \textit{tos3to4-early} a migrace nastavení updateru
+		\item Aktualizace zbytku systému včetně odstranění starých balíčků
+		\item Poslední replan (pšš, stejně nám nejde síť)
+		\item Reboot
+		\item Odstranění \textit{tos3to4} a dalších migračních balíčků
+	\end{enumerate}
+	Plus nějaké další přeplánování a další speciální balíčky (\textit{fix-*}).
+\end{frame}
+
+\begin{frame}
+	\Large Děkuji za pozornost. Otázky?\\
+
+	\vspace{0.5cm}
+	\small karel.koci@nic.cz
+
+	\vspace{0.5cm}
+	\small \url{git.cynerd.cz/presentations/about/}
+\end{frame}
+
+\end{document}
-- 
cgit v1.2.3

