jokainen järjestelmä tarvitsee käynnissä olevat prosessit ensisijaisten tavoitteidensa täyttämiseksi. Mutta joskus asiat menevät pieleen ja prosessi voi kaatua. Järjestelmän kokoonpanosta riippuen luodaan ydinkaatopaikka. Toisin sanoen, muisti tilannekuvan kaatunut prosessi tallennetaan. Termi ydin viittaa itse asiassa vanhoihin magneettisiin ydinmuisteihin vanhemmista järjestelmistä. Vaikka tämäntyyppistä muistia ei enää käytetä, käytämme tätä termiä edelleen Linux-järjestelmissä. Tarpeeksi historiaa, Let ’ s konfiguroida meidän Linux-järjestelmä oikein käsitellä ydin kaatopaikat.
Sisällysluettelo
Linux ja core dumps
useimmissa Linux-järjestelmissä on core dumps oletusarvoisesti käytössä. Kuten aina, tässä on tehtävä vaihtokauppa. Toisaalta haluamme kerätä tietoa vakauden ja vianmäärityksen parantamiseksi. Toisaalta haluamme rajoittaa debug-tietoja ja välttää arkaluonteisten tietojen vuotamista.
ensimmäinen vaihtoehto on hyvä koneille, joissa on tutkittava epävakaita ohjelmia, kuten kehittäjän työasema. Toinen vaihtoehto sopii paremmin arkaluonteisten tietojen tallentamiseen tai käsittelyyn tarkoitettuihin tuotantojärjestelmiin.
Poista ydinkaatopaikat
on järkevää poistaa kaikki ydinkaatopaikat Linuxista oletusarvoisesti kaikista järjestelmistäsi. Tämä johtuu siitä, että tiedostot vievät levytilaa ja saattavat sisältää arkaluonteisia tietoja. Joten jos et tarvitse ydin kaatopaikkoja vianmääritystarkoituksiin, niiden poistaminen käytöstä on turvallinen vaihtoehto.
vaihtoehto 1: ulimit asetustiedoston kautta
ytimen kaatopaikkojen poistamiseksi on asetettava ulimit
arvo. Tämä tapahtuu /etc/security/limits-järjestelmän kautta.conf tiedosto ja määrittelee joitakin shell erityisiä rajoituksia.
hyvä tietää, että on pehmeitä ja kovia rajoja. Kova raja on jotain, jota ei voi koskaan ohittaa, kun taas pehmeä raja voi olla voimassa vain tietyille käyttäjille. Jos haluamme varmistaa, ettei mikään prosessi voi luoda ydinkaatopaikkaa, voimme asettaa ne molemmat nollaan. Vaikka se voi näyttää Boolen (0 = epätosi, 1 = tosi), se itse asiassa ilmaisee sallitun koon.
* pehmeä ydin 0
* kova ydin 0
tähti merkki tarkoittaa, että se koskee kaikkia käyttäjiä. Toisessa sarakkeessa ilmoitetaan, haluammeko käyttää kovaa vai pehmeää rajaa, minkä jälkeen sarakkeet ilmoittavat asetuksen ja arvon.
Vaihtoehto 2: Määritä ulimit profiilin kautta
ulimitin arvot voidaan asettaa myös /etc/ – profiilin tai /etc/ – Profiilin mukautetun tiedoston kautta.d Hakemisto. Jälkimmäistä suositaan, kun se on saatavilla. Esimerkiksi luomalla tiedoston nimeltä /etc/profile.d/disable-coredumps.sh.
echo ”ulimit – c 0 > / dev / null 2>&1” > /etc / profiili.d / disable-coredumps.sh
tämä komento Lisää asetuksen uuteen tiedostoon ja asettaa sekä pehmeän että kovan rajan nollaan. Jokainen käyttäjä saa tämän arvon kirjautuessaan sisään.
Ulimitin asetusten lisäksi on huomioitavana myös ytimen asetuksia. Joten valitsemalla yksi vaihtoehdoista on ensimmäinen askel.
vaihtoehto 3: Poista käytöstä systemd: n kautta
käytettäessä systemd: tä ja systemd-coredump-palvelua, vaihda coredump.conf-tiedosto. Tämä tiedosto sijaitsee todennäköisesti osoitteessa / usr/lib / sysctl.d / 50-coredump.conf. Koska systemd on joukko tiedostoja, varmista tarkistaa muut kuten:
Aseta Tallennusasetukseksi ”ei mitään”. Määritä sitten ProcessSizeMax rajoittamaan maksimikoko nollaan.
Storage=none
ProcessSizeMax=0
yleensä riittää vain ladata systemd kokoonpano.
systemctl daemon-reload
jos tämä vielä luo ytimen dump, käynnistä järjestelmä uudelleen.
Poista käytöstä setuid-prosessit, jotka dumppaavat muistinsa
prosessit, joiden käyttöoikeudet ovat koholla (tai setuid-bitti), saattavat silti pystyä suorittamaan ytimen dumppauksen muista asetuksistasi riippuen. Koska näillä prosesseilla on yleensä enemmän pääsyä, ne saattavat sisältää muistissa herkempiä datasegmenttejä. Joten aika muuttaa tämäkin. Käyttäytymistä voidaan muuttaa sysctl-avaimella tai suoraan /proc-tiedostojärjestelmän kautta. Pysyvissä asetuksissa käytetään tyypillisesti sysctl-komentoa ja-määritystä. Asetusta kutsutaan ”avaimeksi”, johon liittyy siihen liittyvä arvo (tunnetaan myös nimellä avainarvopari).
jos haluat poistaa ohjelman käytöstä pudotettavalla setuid-bittillä, aseta FS.suid_dumpattavissa nollaan.
echo "fs.suid_dumpable=0" >> /etc/sysctl.conf
Lataa sysctl-asetukset uudelleen – P-lipulla aktivoidaksesi tekemäsi muutokset.
sysctl -p
haluatko vain testata tekemättä pysyviä muutoksia? Käytä sysctl -w
, jota seuraa avain=arvo.
Vihje: sysctl: n avulla voit virittää järjestelmäsi ja se on hyvä tapa kovettaa Linux-ydin.
Ota käyttöön ytimen kaatopaikat
ensisijainen syy sallia ytimen kaatopaikat on vianmääritystarkoituksessa. Dumped muisti prosessin voidaan käyttää virheenkorjaus ongelmia, yleensä kokeneemmat Kehittäjät. Ohjelmistotoimittaja voi pyytää ottamaan käyttöön ydinkaatopaikat. Yleensä selvittää, miksi prosessi kaatui ensinnäkin ja löytää siihen liittyvä rutiini, joka aiheutti sen.
ydinjätteiden ottaminen käyttöön Linuxissa on samanlaista kuin niiden poistaminen käytöstä, paitsi että muutama täsmällinen yksityiskohta pitäisi määrittää. Jos esimerkiksi tarvitset vain tietoja tietystä ohjelmasta, voit käyttää pehmeitä rajoja. Tämä tehdään käyttämällä -S
, joka osoittaa, että se on pehmeä raja. -c
merkitsee ydinkaatopaikan kokoa.
ulimit -S -c 0
seuraava askel on vain sallia oma-ohjelma-to-vianmääritys ’luoda ydin dump.
ulimit -S -c unlimited my-program-to-troubleshoot
jos haluat sallia kaikkien prosessien käyttää ydinjätteitä, käytä yllä olevaa riviä ilman ohjelmaa tai aseta järjestelmäraja kohdassa /etc/security/limits.conf
* soft core unlimited
setuid-binäärien vianmääritys
binäärit, joissa on setuid-bittijoukko, voidaan suorittaa pääkäyttäjän oikeuksilla. Tätä erityislaatuista pääsyä on rajoitettava mahdollisimman paljon. Myös luomiseen ydin kaatopaikkojen, se on määritettävä oikein. Tämä tehdään sysctl fs: llä.suid_käytettävä avain.
- 0 – poistettu käytöstä
- 1-käytössä
- 2-käytössä rajoituksilla
joten jos haluat tehdä vianmäärityksen setuid-bittijoukolla, voit tilapäisesti muuttaa fs: ää.valitse 1 tai 2. Sen asettaminen arvoon 2 on edullista, koska tämä tekee ydinjätteistä luettavia vain pääkäyttäjälle. Tämä on hyvä vaihtoehto järjestelmille, joilla on arkaluonteisia tietoja. Vaihtoehdon asettaminen arvoon 1 sopii paremmin henkilökohtaisiin kehitysjärjestelmiin.
luo normaalit dumppitiedostot
yksi Linux-järjestelmien suurista mysteereistä on, missä ydinkaatopaikat sijaitsevat. Linuxissa on kikka, jolla voi kaapata ydinkatot. Tämä asetus tehdään sysctl-ytimen kautta.core_pattern-asetus tai / proc/sys/kernel / core_pattern. Useimmissa järjestelmissä on putki (|
) tässä asetuksessa, joka osoittaa, että ohjelman täytyy huolehtia luodusta datasta. Joten jos mietit minne ydin dump menee, seuraa putkea!
Ubuntu-järjestelmien ydinjätteet menevät tyypillisesti Apportille. Red Hat-pohjaisissa järjestelmissä se voidaan ohjata automaattiseen Vikailmoitustyökaluun (Abrt).
voit väliaikaisesti muuttaa tätä asetusta kaikumalla ”core” kyseiseen tiedostoon tai käyttämällä sysctl
– apuohjelmaa.
sysctl -w kernel.core_pattern=core
tärkeä huomio on, että tämä muutos ei välttämättä riitä. Se riippuu myös fs: stä.suid_dumpable-asetus. Varoitus kirjataan kernel loggeriin, jos näin on.
Sep 06 15:51: 18 karkaisuydin: vaarallinen core_pattern käytetään suid_dumpable=2: n kanssa. Putkenkäsittelijä tai täysin pätevä core dump polku tarvitaan.
aseta core_pattern tarvittaessa täydelle polulle, valinnaisesti muuttujilla, jotka määrittelevät, kuka sitä ajoi, PID jne.
sysctl-w-ydin.core_pattern= / var/crash / core.%u.%e.%p
tässä esimerkissä kaatopaikat sisältävät käyttäjätunnuksen, ohjelman nimen ja prosessitunnuksen.
Systemd core dumps
käytettäessä nykyaikaista Linux-jakelua systemd on todennäköisesti käytössä. Voit joutua ohittamaan asetukset /etc/sysctl: n kautta.d / 50-coredump.conf ja määritellä, miten ja missä haluat tallentaa ydin kaatopaikat.
käyttäen systemd-coredump
omaa ydintä.core_pattern voidaan määritellä käyttämään systemd-coredump-apuohjelmaa. Oletuspolku, johon ydinjätteet tallennetaan, on sitten kohdassa / var/lib/systemd / coredump.
kokoonpanon testaaminen
useimmat muut tutorialit vain antavat sinulle Määritettävät asetukset. Mutta mistä tiedät, että asiat toimivat odotetusti? Sinun täytyy testata sitä!
Create a core dump
optio 1: Create an unstable program
Let ’ s create a simple program. Sen ensisijainen tavoite on kaatua suoritettaessa ja sitten vaihtoehtoisesti luoda ydin dump. Asenna GCC järjestelmääsi ja luo tiedoston kaatuminen.c kotihakemistossasi.
int main(){ return 1/0;}
tämä ohjelma aloittaa tärkein toiminto ja palauttaa kokonaisluku arvo (numero). Se kuitenkin jakaa 1: n nollalla, mikä ei ole sallittua ja kaatuu. Seuraava askel on rattaiden ohjelmamme kokoaminen.
epävakaa pieni ohjelmamme
jopa kääntäjä näyttää ohjelmamme sisältävän vakavan ongelman ja näyttää varoituksen siitä. Katsotaan nyt, onko näin.
hieno kolari!
tältä yhdeltä riviltä voimme oikeastaan oppia muutamia asioita. Ensinnäkin, että se lopetti poikkeusluvalla ja viittasi erityisesti liukulukuihin. Kyseessä on ohjelmille tarkoitettu desimaalilukumuoto, joten se voi viitata siihen, että jotain tapahtui matematiikkaa tehdessä. Toinen päätelmä on, että ydin on polkumyynnillä, koska (ydin polkumyynnillä) lisäys lopussa. Jos ydinjätteet olisi poistettu käytöstä, tämä ei näkyisi.
hienoa, joten tämän kaatumisen edellä meillä on nyt dumpattu tiedosto, eikö? Ei aivan. Linux-jakelusta riippuen asiat eivät välttämättä ole niin yksinkertaisia kuin miltä näyttää. Jokainen Jakelu käsittelee eri tavalla ydinkaatoja ja oletusasetuksia. Myös uusimmat Linux-jakelut käyttävät systemd: tä nyt ja sääntöjä on hieman muutettu senkin myötä. Riippuen kokoonpanosta, saatat joutua etsimään ydin kaatopaikkoja. Joten tässä on muutamia vinkkejä varmistaa, että kaikki on määritetty oikein.
Vaihtoehto 2: tapa käynnissä oleva prosessi
sen sijaan, että käytät testiohjelmaa, voit myös lopettaa olemassa olevan prosessin. Tämä tehdään käyttämällä sigsegv, joka on lyhenne segmentointivirheestä ja tunnetaan myös segmentointivirheenä.
kill -s SIGSEGV PID
jos korvaat PID: n”$$”: lla, nykyinen ohjelma (todennäköisesti komentotulkkisi) kaatuu. Kaikki tieteen hyväksi, eikö?
vaihtoehto 3: käyttämällä gdb: tä
jos sinulla on kehittäjän vianetsintätyökalu GDB asennettuna, liitä valitsemaasi prosessiin sen prosessitunnuksen (PID) avulla.
gdb -p 1234
sitten kun GDB-kehote, luo ydin dump vetoamalla generate-core-tiedosto ohje. Kun olet käyttänyt tätä komentoa, sen pitäisi palauttaa tulosteesi.
tallennettu corefile-ydin.1234
Tarkista ulimitin asetukset
ulimitin asetukset määrittelevät, mitä voi tapahtua, kun ohjelma kaatuu. Joten on turvallista ensin tarkistaa tämä, sekä root ja normaali ei-etuoikeutettu käyttäjä.
Tarkista kova raja ydinjätteiden varalta:
ulimit -H -c
tarkista myös pehmeä raja:
ulimit -S -c
Tarkista ydinkuvio
käytä /proc-tiedostojärjestelmää arvon keräämiseen ja sen vaihtamiseen väliaikaisesti testauksen aikana. Jos haluat käyttää sysctl: ää, Kysy ytimestä.core_pattern-avain.
cat /proc/sys/kernel/core_pattern
se voi näyttää jotain tällaista.:
|/usr/share/apport/apport %p %s %c %P
tällöin kaatuminen johdetaan apport-apuohjelmaan. Tämä tarkoittaa, että onnettomuudet analysoidaan Apportissa. Normaalisti kaatumiset löytyvät /var/crash-versiosta, mutta ne voivat olla myös /var/spool-tai /var/lib/systemd/coredump-versioissa muissa Linux-jakeluissa.
Tarkista päiväkirjasta (systemd)
meidän tapauksessamme journalctl
näyttää kaatumisemme, joten se on alku.
tarkistettuasi kaikki nämä asetukset sinun pitäisi pystyä luomaan mukava core dump.
Conclusion
Core dumps voi olla hyödyllinen vianmäärityksessä,mutta katastrofi arkaluonteisten tietojen vuotamisessa. Poista ydinjätteet käytöstä, kun se on mahdollista, ja ota ne käyttöön vain silloin, kun todella tarvitaan. Tarkista tällöin, onko tiedostot tallennettu turvallisesti, jotta tavalliset käyttäjät eivät näe tietoja. Ja riippumatta siitä, mitä valintaa teit, testaa aina, toimiiko kokoonpanosi juuri niin kuin odotat sen toimivan.