Orada Olmayan Boşluk: Karanlıkta Fedora Yükseltmek
Tek gerçek yarası tek bir görünmez karakter olan bir Fedora 43 → 44 sürüm yükseltmesi.
Fedora 43 → 44. Tam bir sürüm yükseltmesi — ve bu serinin karakterine sadık kalarak, beni neredeyse batıran şey tek bir görünmez karakterdi.
Bu serinin son iki bölümü Sway masaüstümü çalıştırmakla ilgiliydi — kara bir ekranı bir yuvaya çevirmek, sonra baştan beri çalışan ses tuşlarının peşine düşmek. Bu bölümse daha korkutucu bir şeyle ilgili: tüm temeli bilerek söküp altına yenisini kaydırmak; hem de canlı, sahip olduğum tek dizüstünde.
“continue os update.”
Arkeoloji · dnf historyUtanç verici biçimde, üç kelimeyle başladı. Taze bir oturum açtım ve “continue os update” yazdım — ne yaptığıma dair hiçbir hafızası olmayan bir bağlama. Tam olarak neye devam edeceğim?
O yüzden bir şeye dokunmadan önce, arkeoloji. dnf history, tuttuğunu bilmediğin bir günlüktür:
dnf history list | head
Günlük diyordu ki: birkaç gün önce bir system-upgrade download, bu sabah bir dnf upgrade --refresh, hemen ardından bir kmod-v4l2loopback yeniden derlemesi. rpm -E %fedora ve çalışan çekirdekle çapraz kontrol edince karar netti: zaten Fedora 43’teydim, taze açılmış. Büyük yükseltme olmuştu. “Devam et”, yükseltmeyi yap demek değildi — ardından temizle, sonra bir sonrakini sıraya koy demekti. Sıfırıncı ders: geçmişteki sen muğlak bir not bıraktığında, nota inanmadan önce şimdiki seni günlükleri okumaya zorla.
Çöp olmayan artıklar
Denetim · sana hâlâ kimin ihtiyacı var?Her sürüm yükseltmesi tortu bırakır: eski bir Fedora için derlenmiş, hiç yeniden derlenmemiş, bayat bir .fc42 ya da .fc41 etiketiyle orada duran paketler. Tembel hamle dnf autoremove deyip çekip gitmek. Dürüst hamle, her birine sormak: sana hâlâ kimin ihtiyacı var?
rpm -qa | grep -E '\.fc4[12]\.'
Bir düzine şüpheli. Ama ters bağımlılık kontrolü, yarısını “öksüz”den “yük taşıyan”a çevirdi:
- webkit2gtk4.0 (fc42) ← hâlâ uzak masaüstü istemcim tarafından çekiliyor
- javascriptcoregtk4.0 (fc42) ← o webkit’in ihtiyacı
- vamp-plugin-sdk (fc42) ← kendisi güncel olan Audacity’nin ihtiyacı
“Artık”, “çöp”ün eşanlamlısı değildir. Hiçbiri sökülmek için güvenli değildi; onlara bağımlı uygulamalar gayet günceldi, sadece henüz yeni kütüphanelere karşı yeniden derlenmemişlerdi. (webkit zincirine tutun — sonda sessiz bir ödülü var.) Tek gerçek ölü ağırlık eski bir çekirdek setiydi ve o bile bir sonraki çekirdek kurulumunda kendiliğinden budanacaktı. Onu salt düzen dopamini için elle kaldırdım.
Yapılandırma işaretleri ve benimsenmeye değer bir direktif
İnceleme · .rpmnew / .rpmsaveYükseltmeler .rpmnew ve .rpmsave dosyaları saçar — paket yöneticisinin “bu yapılandırma hakkında bir fikrim vardı ama seninkinin üstüne yazmak istemedim” deme biçimi. İkisi refleksle silmek yerine okunmaya değerdi:
- cups-browsed.conf: yükseltme sonrası bir scriptlet sessizce BrowseRemoteProtocols none ayarlamıştı — cups-browsed CVE serpintisinden bir sıkılaştırma varsayılanı. Eski kayıtlı kopyamda daha konuşkan dnssd cups vardı. Kilitli none’ı tuttum ve işareti sildim. Burada eski değerini “geri yükleyerek” yardımsever olmaya kalkma.
- chrony.conf: özel NTP sunucu satırım sağlamdı, ama yeni varsayılan, kullanımdan kalkmış bir artık-saniye direktifini modern biriyle değiştirmişti:
# old, deprecated leapsectz right/UTC # new leapseclist /usr/share/zoneinfo/leap-seconds.list
Benimsemek zararsız göründü. Sevgili okur, zararsız değildi.
Orada olmayan boşluk
Hata · eksik bir boşlukDirektifi yerine koymak için sed’e uzandım. Ve sed bana bunu verdi:
leapseclist/usr/share/zoneinfo/leap-seconds.list
Dikkatlice bak. leapseclist’ten sonra boşluk yok. Tek karakterlik bir yara — chrony’nin bir sonraki ayrıştırmada düpedüz reddedeceği bozuk bir direktif. Anahtar sözcük ile argümanı tek bir anlamsız belirtece kaynamıştı.
Bunu yalnızca bu yolculukta daha önce edindiğim bir refleks sayesinde yakaladım: zaferi ilan etmeden önce doğrula. Gözlerimle değil — gözler eksik bir boşluğun üstünden kayıp geçer — boşluğu görünür kılan bir araçla:
cat -A /etc/chrony.conf | grep leap
# leapseclist/usr/share/zoneinfo/leap-seconds.list$cat -A yorum katmaz. Eksik aralık tam oradaydı, ortada $ ile çapalanmış bir boşluk yoktu. Bir boşluk ısırana dek görünmezdir; cat -A önce onu ısırtır.
…ve “düzelttiğim” yapılandırma hiç yüklenmemişti
Teşhis · dosya ≠ süreçSonra ikinci tuzak, ilkinin üstüne bekliyormuş gibi yığıldı. Düzenlemem temiz olsaydı bile fark etmezdi — çünkü sistemimde çalışan chronyd hâlâ açılıştan kalmaydı. Günlüğü gururla “artık-saniye verisini almak için right/UTC saat dilimini kullanıyorum” diyordu — eski direktif. (a) bozuk ve (b) yüklenmemiş bile olan bir değişikliği “benimsemiştim”.
Bir yapılandırma dosyasını düzenlemek, çalışan bir arka plan servisini değiştirmez. Söylenince apaçık; o anda görünmez. Düzeltme iki yarıyı da gerektiriyordu:
sed -i 's|^leapseclist/usr|leapseclist /usr|' /etc/chrony.conf # the space systemctl restart chronyd # the reload
Ve günlük gerçeği ancak o zaman söyledi:
chronyd[34630]: Using leap second list /usr/share/zoneinfo/leap-seconds.list
Yeniden başlatma, yeniden yükleme değildir; dosya da süreç değildir. Diskteki şeyi değil, çalışan şeyi kontrol et.
Yeniden başlatma, yeniden yükleme değildir; dosya da süreç değildir.
fritz.box bir yerdir, sunucu değil
Düzeltme · gezgin bir saat kaynağıHazır chrony açıkken, yıllar önce sormam gereken soruyu sordum: bu şey eşitleniyor mu ki? Eşitlenmiyordu.
chronyc sources chronyc tracking # Leap status : Not synchronised
Yapılandırmam server fritz.box iburst’ü gösteriyordu — ev yönlendiricim. Ve fritz.box yalnızca evdeyken çözülür. Bu bir dizüstü. Saatini oturma odasındaki yönlendiriciye sabitlemek, dünyanın geri kalanının her yerinde hiç zaman kaynağı olmaması demek. Bu yüzden ona, hangi kafede olursam olayım var olan sunucular verdim:
pool 2.fedora.pool.ntp.org iburst sourcedir /run/chrony-dhcp # still let the home router chime in as a bonus
Gezgin bir makine mobilyaya bağımlı olmamalı.
Gezgin bir makine mobilyaya bağımlı olmamalı.
Üstünde duracağın bir sonraki katı seçmek
Karar · oyu aynalar versinŞimdi asıl yükseltme. İlk soru: 43 → ne? Sürüm tarihlerine hafızamdan güvenmedim, o yüzden oyu ayna ağına bıraktım. Genel kullanıma sunulmuş (GA) bir sürümün tam bir ayna filosu olur; hâlâ Branched olan biriyse seyrektir. Metalink’leri yoklayınca F44’ün sağlıklı bir ayna sayısı vardı, F45 ise hâlâ inceydi ve ön sürümdü. 43 → 44 oldu — bir takvime dair anımla değil, altyapıyla karar verildi.
Sonra herkesin fazla hızlı tıkladığı kısım — GPG anahtar içe aktarımı:
Importing key 0x6D9F90A6: Userid : "Fedora (44) <fedora-44-primary@fedoraproject.org>" Fingerprint: 36F6 12DC F27F 7D1A 48A8 35E4 DBFC F71C 6D9F 90A6
Bu, işletim sistemini birazdan ezecek her şeyin üstündeki bir yabancının imzasına güvenmenin istendiği an. Bu yüzden y yazmadan önce kontrol ettim: anahtar dosyası resmi fedora-gpg-keys paketinindi, rpm -V diskte değiştirilmemiş olduğunu söyledi ve parmak izi istemle karakter karakter eşleşti. Bir anahtarı körü körüne kabul etmemek için otuz saniye. Değerdi.
dnf5 ipucu
Ayrıntı · dnf4’e karşı dnf5Yükseltmenin ortasında küçük bir şey beni uyandırdı. Durum satırı “Offline-Transaktion testen” olarak döndü — ve o tam Almanca ifade, hatırladığım dnf’in konuşma biçimi değildi. Bu kutudaki dnf’in artık dnf5 olduğunun, eski dnf4’ün ise dnf-3 ikilisi olarak gizlendiğinin ele verişiydi. O tek ayrıntı, daha önceki bir gizemi açıkladı (içlerini eşelediğim tüm dnf4 durum dizinlerinin neden boş olduğunu — yanlış çağı kazıyordum) ve yükseltmenin kendisi konusunda içimi rahatlattı: dnf5’in system-upgrade’inde paket çakışmaları, tek bir dosya inmeden önce çözümleme anında başarısız olur. Sahnenin hiç kurulabilmiş olması, yük taşıyan öksüzlerimin hiçbir şeyi engellemediğinin kanıtıydı.
Hazırlandı, ışıklar kapalı
Yürüt · karanlıkta yükseltmeİndirme, park etmiş ve hazır bir çevrimdışı işlem bıraktı. Asıl takas, gerçek sistem durdurulmuş hâlde, bir yeniden başlatmanın ardından asgari bir ortamda olur — çalışan programların altında yeniden yazılan canlı bir dosya sistemi yok. Uçuş öncesi kontrol listesi: prizde, iş kaydedilmiş, derin bir nefes.
dnf system-upgrade download --releasever=44 # already done, days ago dnf system-upgrade reboot # commit
Sonra ekran o çıplak, siyah üstünde ilerleme çubuğu olan çevrimdışı güncelleyiciye geçiyor, altı bin küsur paket geçit töreni yapıyor ve makine hiç olmadığı bir Fedora’ya yeniden başlıyor. Tam anlamıyla karanlıkta yükseltme.
Temiz indi mi?
Doğrula · hiçbir şeye güvenmeİndi. Ve bu seri bana sakin görünen kısımlara güvenmemeyi öğrettiği için, giriş ekranının sözüne inanmadım. Sağlık kontrolü, sırasıyla:
cat /etc/fedora-release # Fedora release 44 (Forty Four) systemctl --failed # 0 loaded units listed dnf check # (silence — no broken deps, no duplicates)
Başarısız servis yok. Bağımlılık enkazı yok. Yeni çekirdek (7.0.12-200.fc44) ilk denemede açıldı, iki fc43 çekirdeği yedek olarak tutuldu.
Yükseltme günlüğünde yürek hoplatan bir an vardı:
systemd ... Failed to start jobs: Invalid argument systemd ... Remote peer disconnected
Saf adrenalin — ta ki bunların nerede çalıştığını hatırlayana dek. Çevrimdışı yükseltme ortamında ateşlenen paket scriptlet’leri, henüz tam canlı olmayan bir sistem yöneticisiyle konuşamaz. O hatalar beklenir ve zararsızdır; sakin görünen giriş ekranı doğruyu söylüyordu, korkutucu görünen günlük masum olandı. Kara çalışma alanı ve kusursuz ses tuşlarıyla aynı ders, bu sefer sistem yöneticisi kılığında.
Ve notlar dosyasının en çok yanıt istediği iki soru:
- chrony sıçramadan sağ çıktı mı? Tamamen. Yükseltme sonrası: Leap status: Normal, dördü de tam erişimde dört havuz sunucusu, milisaniyenin altında bir sapma ve günlük hâlâ Using leap second list /usr/share/zoneinfo/leap-seconds.list diyor. Uğruna eksik bir boşlukla savaştığım direktif, sürüm yükseltmesinden sapasağlam geçti.
- Öksüzler sonunda bozuldu mu? Daha iyisi — bazıları kendi kendine çözüldü. Tutmak için kafa patlattığım tüm fc42 webkit zinciri — webkit2gtk4.0, javascriptcoregtk4.0, vamp-plugin-sdk — eski kütüphanelere artık ihtiyaç duymayan fc44 sürümleriyle sessizce değiştirilerek düpedüz yok oldu. Sabahki özenli “bunları kaldırma” dedektifliğini yükseltmenin kendisi anlamsız kıldı. fc42’de iki gecikenci kaldı (xl2tpd, hfsutils), henüz fc44 yeniden derlemesi olmayan saf yaprak uygulamalar — tam da tutulması için savunduğum zararsız türden artık.
Geçmişteki bana söyleyeceklerim (yükseltme sürümü)
- Nota güvenmeden önce günlükleri oku. “Devam et”, dnf history bana gerçekte ne yaptığımı söyleyene dek hiçbir anlam taşımıyordu. Geçmişteki sen güvenilmez bir anlatıcıdır; işlem günlüğü değil.
- Bir yapılandırma düzenlemesini cat -A ile doğrula. Boşluklar ısırana dek görünmezdir. Doğru görünen bir direktifle doğru olan bir direktif, gözlerinin çizmeyi reddettiği karakterler kadar farklıdır.
- Yeniden başlatma yeniden yükleme değildir; dosya da süreç değildir. Çalışan arka plan servisinin hiç okumadığı bir yapılandırmayı “düzeltmiştim”. Her zaman yalnızca diskteki dosyayı değil, canlı süreci kontrol et.
- Gezgin bir dizüstünün saatini oturma odana sabitleme. fritz.box bir yerdir. Mobil bir makineye, gittiği her yerde var olan kaynaklar ver.
- GPG parmak izlerini güvenmeden önce oku. Otuz saniyelik kontrol, hiç bakmadığın bir imzaya root’u teslim etmekten iyidir.
- Gerçekte hangi dnf’i çalıştırdığını bil. dnf4 ve dnf5 durumu farklı yerlerde tutar ve farklı ifade eder. Yanlış çağın dizinlerini eşeleyerek gerçek zaman harcadım.
Tüm bu serinin tekrarlayan kıssası kendini dayatmayı sürdürüyor: bu sistemde hiçbir şey senin için olmaz, dolayısıyla her düzeltme gerçek ve anlaşılırdır — ama sorun neredeyse hiçbir zaman ilk parmağını uzattığın yerde değildir. Bu sefer göremediğim bir karakterdi; bir arka plan servisinin okumadığı bir dosyada, orada olmayan bir yönlendiriciye eşitlenerek.
Yapacak hiçbir şeyi olmayan temizlik
Sonsöz · yapacak bir şey yokSürüm artıklarını silip süpürmek için düzenli bir ritüel var — dnf distro-sync, her başıboş paketi yeni sürümle hizaya çeker. Onu tatmin edici son vuruş olarak saklıyordum: tüm o fc43 tortusunu tek kathartik işlemde süpürecek görkemli temizlik.
Çalıştırdım. Bir an düşündü ve dedi ki: yapacak bir şey yok.
Her artık zaten var olan en yeni şeydi. Temizlemeyi planladığım öksüzler ya yükseltme sırasında kendiliğinden eridi ya da gerçekten mevcut en son sürümdü. Sıraya koyduğum dramatik temizlik, tasarımı gereği bir antiklimaks oldu — ben bakmazken sistem kendi ardını sessizce toplamış ve beni, çoktan süpürülmüş bir odada elimde süpürgeyle bırakmıştı.
Bir bakıma yerinde. Serinin en korkutucu işlemi — işletim sistemini deşip karanlığa yeniden başlamak — dramsız geçti ve zafer finali için sakladığım kısım bir hiç-işlem çıktı. Kara ekran paniği, hayalet ses tuşları, kendini vuran pkill — ve şimdi de tek gerçek yarası kendi elimle açtığım eksik bir boşluk olan bir yükseltme. Sorunun hiçbir zaman makine olmadığından şüphelenmeye başlıyorum.