Linux rendszerüzemeltetés

Ubuntu 18.04 szerver frissítés 20.04 Focal Fossa verzióra

Ubuntu 18.04 szerver frissítés 20.04 Focal Fossa verzióra 1280 720 bacsoa

Az elmúlt két napom a a telepítésekről és frissítésekről szólt. Tegnap fel kellett tennem az új Macbook Air M1-emre egy Apache, PHP, MySQL kombót, ma pedig a régóta esedékes Ubuntu 20.04 frissítést csináltam meg a szerveremen. Ez a post utóbbiról szól, de talán leírom majd az M1 Silicon LAMP telepítést is, abban kicsit nagyobb kihívás volt.

A szerverem a Digital Ocean-nél van másfél éve, akkor Ubuntu 18.04-gyel jött, de már 2021 van, a Focal Fossa pedig tavaly jött ki és már itt volt az ideje a frissítésnek. Van ugyan egy részletes angol nyelvű leírás a Digital Ocean oldalán, de ha kizárólag azt követtem volna, akkor most bajban lennék, mert nekem például történt egy kis probléma telepítés során (lásd később).

1. Előkészületek

Három dolgot mentettem le:

  • webszerveren lévő fájlok
  • MySQL adatbázisok
  • /etc könyvtár

A MySQL adatbázisok dumpolásával kezdtem, erre egy 3 soros batch file (hívjuk mondjuk „backup-sql.sh”-nak) alkalmas a következő tartalomal („nano backup-sql.sh” parancs kiadásával szerkeszthetjük a fájlt, ami egyből létre is hozza. Használhatjuk a Midnight Commandert is, de előtte hozzuk létre „touch backup-sql.sh” paranccsal):

#!/bin/sh
for DB in $(mysql -e 'show databases' -s --skip-column-names); do
     mysqldump $DB > "$DB.sql";
done

Kell neki futtatási jog is, mert a Linuxban az új fájlok alapból nem kapnak ilyet:

chmod 500 backup-sql.sh

Futtatás után az aktuális könyvtárban szépen sorban minden adatbázisból készül egy SQL fájl. Azzal most nem akarok foglalkozni, hogy mi kell ahhoz, hogy a bejelentkezett usernél ne kérjen a MariaDB jelszót, de akit érdekel, itt erről egy cikk. Mivel most már van futtatási jogunk a fájlra, akkor egyszerűen lefuttatjuk:

./backup-sql.sh

Ha ez is kész, jöhet a /etc könyvtár. Ez azért hasznos, mert ha az Ubuntu 20.04 frissítés után a telepítő felülír valamit és utána nem fog működni (pl. postfix/levélküldés, SSH, openssl, bármi), akkor vissza tudjuk tenni a régi konfig fájlból, vagy legalább meg tudjuk nézni, hogy ami előtte működött, az most miért nem, tehát össze tudjuk hasonlítani a kettőt. Ezt a parancsot is a /var/www/html adjuk ki a terminálban (vagy onnan, ahonnan majd rsync-kelni fogjuk a fájlokat):

root@xact:/var/www/html $ tar -zcvf ./backup-etc.tar.gz /etc

Jöhet az rsync, a parancs MacOS alatt kb így néz ki (user@1.2.3.4 a szerverünk címe, a /var/www/html pedig az a könyvtár, ahol a lementendő fájlaink vannak, nyilván az előző backup-sql.sh nevű parancsot is ide érdemes tenni, és innen futtatni, hogy az SQL dumpok is ide kerüljenek):

rsync -avr --progress -L user@1.2.3.4:/var/www/html/ /Users/macusername/Documents/backup-directory

A -L kapcsoló azt jelenti, hogy az rsync követi a symlinkeket és azokat is át fogja másolni. Nekem az első partíción nem sok hely van, ezért a /mnt alatt van a weboldalak nagyrésze (ide mountoltam még egy volume-t). Az Apache konfig egységessége miatt át van symlinkelve a /var/www/ alá. Ha a -L kapcsolót kihagyjuk, akkor csak a fizikai fájlokat fogja átmásolni, tehát csak azokat, amik a /var/www/html alatt vannak.

Ez ellesz egy darabig, attól függően, hogy a webszerveren hány virtuálhost (weboldal) van és mekkora mennyiségű fájllal.

Ezzel megvan a mentés. Mielőtt elindítanánk a frissítést érdemes egy terminálon be SSH-zni a szerverre egy SUDO jogú userrel és átváltani root-ra, ha esetleg beüt a krach az installálás során, legyen egy plusz lábunk. Ha nem tesszük meg és lerohad az install, lehet, hogy nem fogunk tudni SUDO-zni, azaz elveszítjuk az irányítást a rendszer fölött. Tehát mielőtt do-release, előtte be SSH-zunk a szerverre egy Sudo joggal rendelkező userrel (ez fontos!):

ssh user@1.2.3.4

Majd átváltunk root userre:

sudo su

Én az installt a Digital Ocean beépített Java-s konzoljából indítottam el böngésző alól, de SSH-ból is csinálhatjuk (de akkor is indítsunk egy külön SSH sessiont az előbb leírt módon).

2. Installálás

Miután beléptem a konzolon először érdemes leállítani a lényeges futó szolgáltatásokat, ne egy élő rendszeren indítsunk operációs rendszer frissítést. Én az Apache-ot és a MySQL-t állítottam le, de ha nálad NGINX van PHP-FPM-mel, vagy bármi egyéb akkor érdemes lelőni azokat is:

sudo systemctl stop apache2

Majd a MySQL-t is:

sudo systemctl stop mysql

Még egy ellenőrzés, hogy biztos leállt:

sudo systemctl status apache2
sudo systemctl status mysql

Ha azt látjuk mindkettőnél, hogy Active: inactive, akkor kezdhetjük a frissítést ezzel a paranccsal:

sudo do-release-upgrade

Ezután jön a következő képernyő:

Itt nyilván nyomjuk ‘y’-t, ha ‘N’-t nyomunk (kis és nagybetű számít), akkor a telepítő kilép. Ezután valami hasonlót fogunk látni:

Itt arról tájékoztat, hogy az új Ubuntu 20.04 rendszer a mostanihoz képest 2 csomagot már nem támogat, 13 csomag el lesz távolítva, 208 csomagot fel fog rakni és 665 csomagot frissíteni fog. Rohadt vicces, hogy ha most visszamennénk 20 évet az időben, amikor még 56k modemmel interneteztünk (aki mondjuk a 80-as évek körül született, mint én is), akkor 19 óra alatt jönne le az 508MB-nyi telepítő adat 🙂 Én itt nyomtam egy ‘d’-t mert kíváncsi voltam a részletekre. Ha téged nem érdekel, nyomj ‘y’-t (fontos a kis és nagybetű!). Tehát a ‘d’-re kattintva ez fogadott:

A PHP 7.2 el lesz távolítva, ami nem is baj, mert más amúgy is 7.4-re akartam frissíteni (sőt már itt van a 8.0 is), meg pár Apache2 modul. Na és akkor itt van ez a kérdés, ami miatt érdemes be SSH-zni jól egy külön terminál sessionben:

Itt annyit közöl, hogy egy csomó szolgáltatás újraindul és ha megszakad valami, akkor nem fogsz tudni bejelentkezni (pl. SSH-val sem).

Ezután még jó sok mindent fogunk látni a képernyőn és sokszor, sok minden fog kérdezni az Ubuntu telepítőő. Főleg olyanokat, hogy a már meglévő konfig fájl eltér attól, amit installálni szeretnénk. Én a nagyrészét felülírtam, leginkább azokat, amiről tudtam hogy nem nyúltam hozzá. Amit viszont sokat állítgattam (pl. opendmarc), abból meghagytam a 18.04-es verziót. Nekem egészen eddig a kérdésig nem történt semmi probléma:

Itt nyomtam egy ‘D’-t, hogy mutassa a különbségeket. Ez amúgy az SSH konfig, ahol én pl. olyanokat állítottam be, hogy jelszóval ne lehessen be SSH-zni a szerverre, csak SSH kulccsal, stb. Viszont valamiért a ‘D’ megnyomása után fogta magát a rendszer és visszadobott ide:

Kicsit furcsa is volt, hogy a telepítés kellős közepén egy kérdés után visszakapom ezt a képernyőt. Mivel már csinálta egy ideje a telepítést még az is felmerült bennem, hogy végzett. Gondoltam megnézem az oprendszer verziót:

Úgy tűnik minden oké igaz? Sajnos nem, itt csak annyi történt, hogy az alapcsomag már befrissült, tehát a /etc/issue fájl tartalma lefrissült új oprendszer verziószámára, de azon kívül minden a régi maradt. Tehát megszakadt a telepítés. Ellenőriztem a PHP verziót, ami a 18.04-en még 7.2 volt, viszont a 20.04-n már 7.4-nek kellene lennie, és a gyanúm beigazolódott:

Gondoltam kiadom újra a do-release-upgrade parancsot, de nem segített:

Itt már látszik a gond a do-release-upgrade-re azt mondja a telepítő, hogy nincs fejlesztői változat, azaz a rendszer már a legfrissebb. Csakhogy a dist-upgrade -f (‘-f’, azaz force kapcsoló kell!) kiadva látszik, hogy a dpkg csomagkezelő frissítés közben leállt, tehát akkor adjuk ki ezt a parancsot:

sudo dpkg --configure -a

Ez már jó lett, elkezdte folytatni a frissítést a dpkg. Újra jött a kérdés:

Most ahelyett, hogy megnéztem volna a különbségeket (az előbb itt fagyott le a telepítő, plusz nem érdekelt, mert már elmentettem a teljes /etc könyvtárat) inkább felülírtam a régit a legújabb konfig fájllal. Ezután még jött egy csomó hasonló kérdés, majdnem mindenre (kivéve pl. opendmarc) Y-t nyomtam. Jött egy ilyen:

A dpkg lefutott, de az lxd-client nem tudta frissíteni. Akkor újra kiadtam ezt:

sudo apt dist-upgrade -f

Ezután újra elkezdett frissítgetni, köztük ezt a problémás LXD klienst is:

Fogalmam sincs mi volt ez, úgyhogy nyomtam egy ‘latest’-t (bár a telepítő a 4.0-t ajánlott). Folytatódott a frissítés, majd jött egy ilyen:

Amiről tudtam, hogy nem nyúltam hozzá a 18.04 konfigurálása után (ez volt az első Ubuntu verzióm), azt felülírtam az új verzióval (tehát ‘Y’-t nyomtam). Miután végzett a csomagok frissítésével, a grub-ot is frissíteni akarta:

Mivel az én szerveremen nincs más oprendszer, csak az Ubuntu, ezért itt a ‘package maintainer’s version’ lehetőséget választottam. Jött még néhány konfig fájl, például a Midnight Commanderé is:

Ezt véletlenül felülírtam, így a 20.04-en megint be kellett állítanom, hogy a backspace-re kattintva menjen vissza egy könyvtárat (mivel ez a beállítás az mc.keymap fájlban van tárolva, leírást lásd itt). Aztán jött az Opendkim konfig kérdése:

Na erre nyomtam például N-t nyomtam, mert elég sokat szórakoztam az email címeim authentikálásával, hiányzik a francnak, hogy újra be kelljen állítani. A vége felé még jött egy ilyen:

Itt Yes-t választottam, mert szeretném a jövőben saját kezűleg beállítani ezt. Néhány adabázisra vonatkozó kérdés, jelszó miegymás:

Ezután végzett a telepítés, amit egy rövid ‘done’ üzenettel adott tudtomra. Újraindítás után még nyomtam egy update-t és leszedtem a már nem használt csomagokat (ezt a do-release-upgrade amúgy megtenné helyettünk):

sudo apt autoremove

Ezután újraindítottam a szervert:

sudo init 6

Újraindítás után már a jól megszokott képernyő fogadott:

Újra leellenőriztem a php verziót:

Minden jó, ha vége jó. A telepítéshez köszönöm a segítséget Szécsényi Zoltán barátomnak!