programmatūra · 5 min · 26.07.2026

Ubuntu pēc 21 gada izņem debian_version, skriptiem jālasa os-release

Ubuntu izstrādātājs Benjamīns Drungs 24. jūlijā jautāja ubuntu-devel vēstkopai, vai kāds iebilst pret faila /etc/debian_version izņemšanu no pakotnes base-files. Ja iebildumu nebūs, fails pazudīs Ubuntu 26.10 laidienā, kas iznāks 15. oktobrī. Līdz ar to tiktu aizvērta Launchpad kļūda numur 19353, kuru Marks Brauns pieteica 2005. gada 31. jūlijā.

Fails satur vienu teksta rindu. Ubuntu 26.04 tajā ierakstīts forky/sid. Tas ir Debian versijas apzīmējums: Ubuntu izstrādes laikā pārņem pakotnes no Debian nestabilā zara sid, no kura pašlaik tiek gatavots Debian 14 ar segvārdu forky. Skriptam, kas grib uzzināt Ubuntu versiju, šī rinda nepalīdz.

Kļūda, kas nogaidīja divdesmit vienu gadu

Launchpad kļūdas nosaukums ir tiešs: rīki, kas paļaujas uz /etc/debian_version, apjūk. Brauns 2005. gadā ieteica vienkāršu labojumu, proti, mainīt faila saturu tā, lai uzreiz redzams, ka datorā nav parasts Debian laidiens. Priekšlikums palika bez darbības. Kļūda visus divdesmit vienu gadu ir bijusi statusā Confirmed ar zemu prioritāti un bez atbildīgā izstrādātāja.

Klasiskais upuris bija reportbug. Rīks nolasīja failu un ziņoja, ka lietotājs strādā uz konkrētas Debian versijas, kaut arī sistēma bija Ubuntu. Tā pati loģika mēdz būt instalācijas skriptos, kuri pārbauda tikai faila esamību, lai izlemtu, vai palaist apt vai dnf.

“/etc/os-release pēdējos desmit gadus ir de facto standarts. Rīkiem, kas skatās uz /etc/debian_version, būtu jāskatās uz /etc/os-release,” raksta Drungs.

Ko lasīt vietā

/etc/os-release ir systemd definēts formāts ar atsevišķiem laukiem, kurus var ielādēt tieši čaulā. Ubuntu 26.04 tajā ir ID=ubuntu, ID_LIKE=debian, VERSION_ID="26.04" un VERSION_CODENAME=resolute. Skriptam, kas meklē Debian saimi, pareizā pārbaude ir ID_LIKE lauks, nevis faila esamība diskā.

Čaulas skriptā rinda . /etc/os-release ielādē laukus kā mainīgos. Pēc tam case ":$ID:$ID_LIKE:" in *:debian:*) noķer gan Ubuntu, gan pašu Debian ar vienu nosacījumu.

Šī pieeja strādā arī uz Linux Mint, Pop!_OS un citiem atvasinājumiem, kuri paši /etc/debian_version nekad nav uzturējuši saprātīgi. Skripts skatās tikai uz ID_LIKE, tāpēc atkrīt jautājums par to, kurš Debian laidiens tur ierakstīts.

Viena detaļa mēdz pārsteigt cilvēkus, kuri os-release lasa pirmo reizi. Faila īstā vieta pēc systemd dokumentācijas ir /usr/lib/os-release, bet /etc/os-release ir relatīva simboliska saite uz to. Relatīva tāpēc, ka absolūta saite pārtrūktu chroot vidē vai initrd. Ja abi faili tomēr pastāv atsevišķi, priekšroka ir /etc versijai un uz /usr/lib jāatgriežas tikai tad, ja pirmā nav.

Izmaiņa attiecas uz Ubuntu base-files pakotni. Debian savā pusē failu patur, jo tur tā saturs atbilst sistēmai, uz kuras fails atrodas. Tāpēc skripts, kuram vajag noskaidrot Debian laidienu uz īsta Debian datora, drīkst turpināt lasīt /etc/debian_version. Kļūda rodas tikai tad, ja to pašu pārbaudi pielieto atvasinājumam.

Otrais fails, kas jau pazudis

Šī ir otrā tāda tīrīšana pēc kārtas. Jaunākais base-files būvējums jau izņēmis /etc/lsb-release, kurš gadiem kalpoja par Ubuntu pašidentifikācijas veidu pirms os-release ieviešanas. Komanda lsb_release oficiālajos Ubuntu konteineru attēlos nav uzstādīta, tāpēc skripti, kuri to sauc, gāžas ar command not found jau tagad.

Rezultāts ir viena identifikācijas vieta trīs vietā. Konteineru būvēšanā tas nozīmē mazāk failu, ko sinhronizēt, jo debian_version saturs mainījās ar katru Debian iesaldēšanu, bet par pašu Ubuntu neteica neko.

Ko šī izmaiņa nesaglabā

Vienu ziņu os-release neaizstāj. Ubuntu os-release failā nav lauka, kas pateiktu, no kura Debian zara pakotnes pārņemtas. Rīkiem, kuriem šī informācija patiešām bija vajadzīga, piemēram, pakotņu pārbūves rīkiem, kas salīdzina Ubuntu bibliotēku versijas ar Debian, pēc izņemšanas nav kur to uzzināt. Praksē tādu rīku ir maz. Mūsdienu programmas atbalsta Ubuntu tieši un tām nav vajadzības rēķināt, kāda ABI versija bija Debian sid pirms diviem gadiem.

Otrs jautājums ir par Docker attēliem, kuri joprojām apgrozībā. Ubuntu 24.04 un 22.04 attēlos fails paliks līdz šo laidienu atbalsta beigām, tāpēc skripts, kas pārbauda tikai /etc/debian_version, dažus gadus turpinās strādāt uz vecākiem attēliem un klupt uz jaunākiem. Tas ir sliktākais variants atkļūdošanai, jo kļūda parādīsies tikai daļā vides.

Kam jāpārbauda savs kods tagad

Vienkāršākais veids atrast problemātiskās vietas repozitorijā ir meklēt faila nosaukumu pilnā tekstā, ieskaitot Dockerfile, CI konfigurācijas un Ansible uzdevumus:

  • grep -rn "debian_version" . pār visu projektu, ne tikai pār čaulas skriptiem;
  • Ansible gadījumā jāskatās ansible_facts.os_family, kas jau tagad nāk no os-release;
  • Python kodā platform.freedesktop_os_release() nolasa to pašu failu bez ārējām atkarībām.

Vēstkopā līdz šim publiskas atbildes ar iebildumiem nav. Drungs vēstulē nenorādīja termiņu, līdz kuram gaida atsauksmes.

Avoti

komentārisaruna

Komentāri

Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.

Pievieno komentāru

Tavs e-pasts netiks publicēts. Obligātie lauki atzīmēti.

vēl no programmatūrasaistītie