Ilgą laiką savo serveriuose naudojau stabilią „Debian“ sistemos šaką, tačiau ne kartą teko įsitikinti internete sklandančiu pokštu, kad stabili „Debian“ šaka tampa pasenusi, kai ji yra išleidžiama. Iš vienos pusės senose programų versijose yra išgaudyta daugiau klaidų ir jų atliekamos funkcijos jau yra nusistovėjusios, tad mažesnė darbo trikio tikimybė. Tačiau neretai prireikia naujo funkcionalo ir tuomet reikia eiti ieškoti paketų "testing", o kartais "unstable" paketų šaltiniuose. Be pasitaikančių įprastinių programų tobulinimo klaidų, minėti šaltiniai turi ir kitą blogybę. Jiems nėra taikoma pirmenybė, pritaikant saugumo spragų pataisas, kas šiaip yra savaime suprantama, nes tai programų tobulinimo poligonas.
Taigi, pasirodžius „Ubuntu 16.04", po neilgų svarstymų nusprendžiau, jog reikia pasikeisti savo virtualizacijos serverio OS. Kadangi jau vis vien buvau apsisprendęs trinti seną OS lauk ir rašyti naują, prieš tai nusprendžiau pabandyti atnaujinti „Debian“ į naujesnę „Ubuntu“ sistemą. Teoriškai tai turėjo pavykti, nes „Ubuntu“ yra kuriama „Debian“ sistemos pagrindu ir naudoja tą pačią paketų valdymo sistemą. Užbėgant už akių - galiu pasakyti, kad atnaujinimas pavyko, tačiau norintiems pakartoti, teks apsišarvuoti kantrybe, nes procesas nebus sklandus ir prireiks paleisti daugiau, nei vieną komandą. Taip pat yra tikimybė, kad atnaujinimas kažkur užstrigs ir vis vien teks trinti sistemą lauk ir instaliuoti iš naujo. Bent jau /home ir /var tikiuosi visi jau laiko atskirame skirsnyje ar LVM tome, ar ne?.. ;)
Taigi, pirmiausia dabar šiek tiek teorijos. Debian sistemos programiniai paketai valdomi „dpkg“ priemone, tačiau ją naudoti tiesogiai nėra patogu, nes diegiant naują paketą, pirmiausia reikėtų susirasti tikslų adresą iš kur atsisiųsti, paskui reikėtų išsianalizuoti visas paketo priklausomybes ir susirasti tikslius atnaujintų priklausomšų paketų adresus. Galiausiai komandinėje eilutėje reikėtų surašyti visų šių paketų adresus.
Tai nėra patogu, todėl geriau naudotis „apt-get“ priemone (arba „apt“, „aptitude“), kuri supaprastina šias užduotis ir dirba kaip „dpkg“ priemonės tarpininkė. Ji ieško programinės įrangos šaltinių /etc/apt/sources.list rinkmenos bei /etc/apt/sources.d katalogo rinkmenų turinyje. Gavusi komandą naujinti sistemą, „apt-get“ perskaito šių rinkmenų turinį, „apt“ aplinkos konfigūraciją, pavyzdžiui, nusakančią paketų šaltinių prioritetus, ir palygina šaltiniuose esamų programų versijas su sistemoje suinstaliuotomis. Jei šaltiniuose yra naujesnių programų, „apt-get“ papildomai išanalizuoja naujų programų versijų poreikius ir papildom ai suranda ar reikia atnaujinti susijusius programinius paketus. Galiausiai vartotojui yra pasiūlomas paketų sąrašąs, kurį galima įdiegti. Todėl, pakeitus „sources.list“ rinkmenoje aprašytus programinės įrangos paketų šaltinius iš „Debian“ į „Ubuntu“, „apt-get“ turėtų surasti naujesnes paketų versijas ir atnaujinus sistemą, pakeisti OS iš „Debian“ į „Ubuntu“.
Priemonė „apt-get“ taip pat leidžia atnaujinti ir pavienius paketus, nurodant „install“ komandą ir paketo ar keleto jų pavadinimus. Programa suras naujas versijas ir pasiūlys jas įdiegti, kaip ir „upgrade“ ar „dist-upgrade“ komandos, kurios naujina VISUS galimus paketus.
Tai tiek teorijos, o dabar prie prie praktinių darbų.
Pirmas žingsnis: išsaugokime originalų sources.list turinį ir sugeneruokime naują sources.list, skirtą „Ubuntu 16.04". Kad nereikėtų ieškoti, kokias eilutes įtraukti į šią rinkmeną, paprasčiau yra pasinaudoti sources.list generatoriumi, pavyzdžiui, šiuo: https://repogen.simplylinux.ch/index.php. Sugeneruotą turinį įrašę į /etc/apt/sources.list, paleidžiame apt-get update ir naujų programinių paketų sarašą.
Morališkai nusiteikiam nuotykiams ir leidžiame:
apt-get upgrade
Pradžioje siūlau naudoti tik „upgrade“, o ne „dist-upgrade“. Šių komandų skirtumas yra tas, jog atnaujintam programiniam paketui pareikalavus papildomo paketo, kurio dar nėra sistemoje, „upgrade“ jį praleis ir nenaujins. Jei naudoti „dist-upgrade“, tai ji bandys atnaujinti visus paketus ir įdiegti papildomus naujus paketus, kurių reikia naujesnėms versijoms. Patirtis rodo, kad masiniai atnaujinimai kartais baigiasi ne kaip, nes „apt-get“ pasiklysta tarp priklausomybių ir pareiškia, negalinti įdiegti to ar ano paketo.
Taigi pirmas „upgrade“ pasiūlo atnaujinti 673 paketus ir palikti 238 neatnaujintus. Pradžia nebloga.
vm-serv:/etc/apt# apt-get upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... The following packages were automatically installed and are no longer required:
docutils-common docutils-doc libdirectfb-1.2-9 libgfortran3 libjim0.75 liblogging-stdlog0 liblognorm1 ...
vde2 vim-common vim-tiny virt-viewer w3m wget whiptail whois wireless-tools wpasupplicant wwwconfig-common x11-apps
x11-common x11-session-utils x11-utils x11-xkb-utils x11-xserver-utils xauth xdg-user-dirs xdm xfonts-100dpi xfonts-75dpi
xfonts-base xfonts-scalable xfonts-utils xfsprogs xinit xkb-data xorg-docs-core xserver-common xserver-xorg-input-all xterm
zip
673 upgraded, 0 newly installed, 0 to remove and 238 not upgraded.
Need to get 148 MB of archives.
After this operation, 28,1 MB disk space will be freed.
Do you want to continue? [Y/n] y
Kelio atgal nėra. Banzaiii... Paketų tvarkyklei baigus darbą, patikrinau branduolio versiją (viena pagrindinių priežasčių, kodėl norėjau keisti sistemą) ir, kaip ir tikėjausi, pamačiau, jog jis lio neatnaujintas.
vm-serv:/etc/apt# dpkg -l | grep linux-image
ii linux-image-3.16-2-amd64 3.16.3-2 amd64 Linux 3.16 for 64-bit PCs
ii linux-image-3.16.0-4-amd64 3.16.7-ckt25-2 amd64 Linux 3.16 for 64-bit PCs
vm-serv:/etc/apt#
Taigi kitu žingsniu bandžiau atsinaujinti patį OS branduolį. Pirmiausia reikėjo susirasti tikslius branduolio paketų pavadinimus.
vm-serv:/etc/apt# apt-cache search linux-image
Iš duoto sąrašo įdomūs buvo šie du:
linux-image-generic - Generic Linux kernel image
linux-image-extra-virtual
Kadangi turėjau patirties, kai dėl nežinomų priežasčių „apt-get“ naujindama branduolį, praleisdavo „linux-image-extra“ paketą ir po perkrovimo kompiuteris neturėjo tinklo ir vaizdo plokštės tvarkyklių, nusprendžiau „linux-image-extra-virtual“ įtraukti mano naujinamų paketų sąrašą.
vm-serv:/etc/apt# apt-get install linux-image-generic linux-image-extra-virtual
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
db-util db5.3-util docutils-common docutils-doc gcc-4.7-base geoclue-2.0 git-man gstreamer1.0-plugins-base
...
python-docutils python-ntdb python-pil python-pygments python-roman python-talloc python-tdb qemu-slof qemu-user
qemu-user-binfmt samba-common seabios sharutils vde2 wpasupplicant
Use 'apt autoremove' to remove them.
The following additional packages will be installed:
crda iw linux-firmware linux-image-4.4.0-21-generic linux-image-extra-4.4.0-21-generic thermald wireless-regdb
Suggested packages:
fdutils linux-doc-4.4.0 | linux-source-4.4.0 linux-tools linux-headers-4.4.0-21-generic
The following NEW packages will be installed:
crda iw linux-firmware linux-image-4.4.0-21-generic linux-image-extra-4.4.0-21-generic linux-image-extra-virtual
linux-image-generic thermald wireless-regdb
0 upgraded, 9 newly installed, 0 to remove and 156 not upgraded.
Need to get 90,4 MB of archives.
After this operation, 341 MB of additional disk space will be used.
Do you want to continue? [Y/n]
Taigi, sąraše yra ir naujas branduolys, ir papildomų modulių rinkinys. Pratęsiau atnaujinimo darbus ir užlipau ant pirmojo grėblio. Sistemoje kažkada buvau įdiegęs „Realtek“ tinklo lustų tvarkyklių paketą, kuris, pasirodo, buvo sugadintas ir nenorėjo pasišalinti geruoju. Įvyko rinkmenų konfliktas, nes diegiamas „linux-firmware“ paketas turėjo rinkmeną, tokiu pat vardu, kaip ir visiškai nesusijęs („apt-get“ algoritmų požiūriu) „firmware-realtek“ paketas.
(Reading database ... 84129 files and directories currently installed.)
Preparing to unpack .../linux-firmware_1.157_all.deb ...
Unpacking linux-firmware (1.157) ...
dpkg: error processing archive /var/cache/apt/archives/linux-firmware_1.157_all.deb (--unpack):
trying to overwrite '/lib/firmware/rtl_nic/rtl8168g-2.fw', which is also in package firmware-realtek 0.43
dpkg-deb: error: subprocess paste was killed by signal (Broken pipe)
E: Sub-process /usr/bin/dpkg returned an error code (1)
vm-serv:/etc/apt#
Paprastas bandymas išmesti „firmware-realtek“ nepavyko:
vm-serv:/var/lib# dpkg --debug=3773 -e firmware-realtek
dpkg-deb: error: failed to read archive 'firmware-realtek': No such file or directory
vm-serv:/var/lib#
Bandymas perinstaliuoti taip pat nepadėjo
vm-serv:/tmp# wget http://ftp.br.debian.org/debian/pool/non-free/f/firmware-nonfree/firmware-realtek_0.43_all.deb
dpkg -i firmware-realtek_0.43_all.deb
vm-serv:/var/lib# dpkg --debug=3773 -e firmware-realtek
dpkg-deb: error: failed to read archive 'firmware-realtek': No such file or directory
vm-serv:/var/lib#
Galiausiai panaršius „Debian“ forumus pavyko rasti stebuklingą komandą, kuri padėjo atsikratyti šio ir kitų konfliktuojančių paketų. Minėtas „firmware-realtek“ nebuvo vienintelis probleminis paketas. Konfliktų kilo ir dėl skirtingos pavadinimų sudarymo politikos, mat „Debian“ autoriai nusprendė savo paketus pavadinti „firmware-linux-*“, o „Ubuntu“ autoriai juos vadino „linux-firmware-*“. Savo ruožtu „apt-get“ algoritmai nusprendė, jog tai tas pačias rinkmenas turintys nesusiję paketai (pavadinimai nesutampa).
dpkg --remove --force-remove-reinstreq firmware-realtek firmware-linux-free firmware-linux-nonfree
Pašalinus konfliktuojančius paketus, galima bandyti taisyti nugriubusį atnaujinimo procesą:
apt-get -f install
Tuomet paaiškėjo, jog kai kuriems branduolio moduliams pritrūko naujų branduolio išeities antraščių, mat juos reikėjo susikompiliuoti, naujinant paketus.
apt-get remove linux-headers-3.16.0-4-common linux-headers-3.16.0-4-amd64 linux-headers-amd64
apt-get install linux-headers-generic
Po šių komandų sistema jau buvo pakankamai atnaujinta ir ją buvo galima iškrauti iš naujo. Tačiau po perkrovimo paaiškėjo, jog neatnaujinus dalies paketų, neliko qemu-kvm ir nebeveikė virtualizacija. Teko rankomis išmesti esamus QEMU ir „Libvirt“ paketus ir diegti naujas versijas. Problema buvo ta pati - „Debian“ ir „Ubuntu“ autoriai prie minėtų paketų pavadinimų nusprenfė priklijuoti specifines sistemų pavadinimų priesagas ir „apt-get“ vėl nesugebėjo surasti naujesnių versijų.
Teko pačiam priverstinai atnaujinti „GNU TLS“ šifravimo paketus ir tvarkyti diegimo procesą:
apt-get install libgnutls30
tada
apt-get -f install
Paskui pačiam šalinti Debian paketus, ir vėl taisyti naujinimo procesą:
dpkg -r $(dpkg -l | grep -E "libvirt|virtinst" | awk '{print $2}') ; apt-get -f install
Ir tik pabaigus tvarkymą, t.y. kai apt-get -f install nurodė, jog daugiau nėra ką tvarkyti, buvo galima įdiegti virtualizacijos sistemos „Ubuntu“ paketų versijas.
apt-get ignstall qemu-system-x86 qemu-kvm libvirt-bin
Tačiau paaiškėjo, kad dar ne visi grėbliai buvo išmindžioti ir sistemos atnaujinimas vėl užstrigo. Teko griebtis visažinio interneto pagalbos ir buvo rasta dar viena stebuklinga komanda, kuri galiausiai sutvarkė šią betvarkę sistemoje:
apt-get dist-upgrade --fix-missing
Visai tikėtina, jog iš karto panaudojus „--fix-missing“, problemų būtų kilę daug mažiau. Šią teoriją patikrinsiu, naujindamas kitą serverį.
Tai, kad po atnaujinimo nebeliko fglrx-driver, nebuvo didelė staigmena. Jau skelbiant „Ubuntu 16.04“ anonsus, nurodoma, jog naujoje versijoje bus išmestos uždarojo kodo AMD tvarkyklės. Senesnių plokščių vartotojams teks naudoti benduomenės parengtas atvirojo kodo versijas, nes AMD pateikiamos uždarojo kodo „fglrx“ nėra suderinamos su nauja X.Org 1.18 grafine aplinka. Tik naujų plokščių savininkai gali tikėtis naujų AMD atvirojo kodo AMDGPU tvarkyklių. O be AMD pateikiamų tvarkyklių neveikia „OpenCL“, kas yra aktualu, pavyzdžiui, dalyvaujantiems paskirstytojo skaičiavimo projektuose ar kasantiems virtualias monetas. Turėkite tai omeny, naujindami „Ubuntu“!
Kol kas sistema veikia puikiai jau kelinta savaitė ir nesimato jokių nesklandumų. :)