Linux-api meililisti on arutamiseks esitatud ettepanek (RFC) asendada vananenud süsteemilogide binaarfailid lastlog, btmp, utmp ja wtmp uute jagatud teekidega, mis kasutavad SQLite'i tagaplaanina. Algatus on suunatud akumuleerunud probleemide lahendamisele, sealhulgas 32-bitiste ajainvesteeringute ülevool problemaatika 2038. aastal, ei laiene koostisosadele, madala päringute sooritusvõime ja kirjutamise aatomisus.
Praegu kasutatakse Linuxis seansside ja autentimiskatsetega seotud andmete salvestamiseks järgmisi binaarfaile, millel on fikseeritud struktuur:
- /var/log/lastlog — время последнего входа (структура «struct lastlog» с полем «ll_time» 32-разрядного типа time_t);
- /var/log/btmp — неудачные попытки входа;
- /var/run/utmp — текущие сеансы;
- /var/log/wtmp — история входов и выходов.
Failide andmeformaat töötati välja juba mitu aastakümmet tagasi ja tal on mitmeid fundamentaalseid piiranguid:
- Väli „tv_sec“ struktuuris „utmpx“ ja väli „ll_time“ „lastlogis“ on tüüpi „int32_t“, mille ajainvesteeringud ülevoolavad 19. jaanuaril 2038. AABI ühilduvuse nõuete tõttu jäävad Need väljad isegi 64-bitistes süsteemides 32-bitisteks, mistõttu probleem mõjutab kõiki Linuxi installatsioone.
- Fikseeritud suurusega kirjed ei võimalda uusi väljade lisamist (näiteks konteineri ID, teenuse nimi, IP-aadress) ilma formaadi täieliku asendamiseta ja kõikide utiliitide uuesti kompileerimiseta.
- Utiliidid last, lastb, who ja lastlog on sunnitud lineaarselt läbi vaatama failide sisu. Suurte logide korral, ilma indeksiteta, mis võimaldaksid salvestuste tõhusat filtreerimist, muutub sisendi/väljundi koormus ja päringut teostamisel tõrked vastuvõetamatuks.
- Kirjutamine binaarfaili ei ole aatomaarne operatsioon. Rikke korral võib salvestus osaliselt kahjustuda.
- Samaaegsete kirjutamise konfliktide vältimiseks logisse mitme protsessi (näiteks sshd ja login) poolt kasutatakse flock-locking't, mis ei taga aatomaarset ja võib viia ummikuteni.
RFC autor soovitab täielikult loobuda binaarsetest formaatidest spetsialiseeritud jagatud teegite kasuks, mis kasutavad SQLite'i. Iga logitüübi jaoks luuakse eraldi teek ühtse C-liidese abil: liblastlog2, libbtmp2, libutmp2 ja libwtmp2. Kõik teegid töötavad andmebaasiga, mille skeem sisaldab 64-bitiseid ajatempleid (tüüp INTEGER) ning indekse kasutaja ja aja järgi. Uute väljade lisamine on võimalik ilma ühilduvust rikkumata (ALTER TABLE kaudu).
SQLite'i kasutamise toetuseks toodi välja 64-bitise INTEGER tüübi kasutamine epohhilise aja salvestamiseks, indeksite kasutamine sisendi/väljundi vähendamiseks andmete valikulise kutsumise kaudu, uute väljade lisamise võimalus olemasolevate kirjetega muutmata, ACID-tehingute tugi, WAL (Write-Ahead Logging) režiim konkurentsituks juurdepääsuks ilma lukustamiseta ning SQLite'i usaldusväärsuse kontrollitud tõhusus.
Smooth ülemineku tagamiseks pakutakse "kahe kirjutamise" (dual-write) strateegiat:
- Programmid, mis kirjutavad binaarfailidesse (login, sshd, sudo, cron jne), muudetakse nii, et nad kirjutaksid samaaegselt nii vanasse binaarfaili kui ka uude SQLite-andmebaasi vastava teegi kaudu.
- Töötatakse välja uued versioonid utiliitidest (last2, lastb2, who2, lastlog2), mis loevad andmeid SQLite-andmebaasidest, kasutades indekseid kiireks tööks. Vanad utiliidid jätkavad töötamist varasemate failidega.
- Mõne aasta pärast, kui enamik süsteeme on uuendatud, võib toetuse lõpetamine vanade formaatide kirjutamiseks olla võimalik ning vanad utiliidid kuulutada vananenuks.
Lisa arutluse all olevad küsimused:
- Eraldiste teekide eraldi arendamise otstarbekus või ühte kokku viimise (nt libsession2).
- Teekide ja utiliidide nimede valimine (kas säilitada ajaloolised nimed või minna üldistele).
- Andmebaaside failide asukoht (/var/lib/ rakenduste olekute jaoks või /var/log/ logide jaoks).
- Skeemi versioonimise ja migratsiooni mehhanism.
- SQLite'i jõudlusparameetrid erinevates stsenaariumides (serverid, manustatud süsteemid).
- Fallback-backendi, mis salvestavad logisid lihtsustatud binaarformaadis, süsteemide jaoks, kus SQLite võib olla üleliigne (näiteks sisseehitatud seadmed, mille mälulimiidid on ranged).
Allikas: opennet.ru
