\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}