Shell-komentosarjojen ja Linux-tiedostojärjestelmän vianmääritys - Osa 10


Linux-säätiö käynnisti LFCS -sertifikaatin ( Linux Foundation Certified Sysadmin ), upouuden aloitteen, jonka tarkoituksena on antaa yksilöille kaikkialla (ja missä tahansa) saada sertifikaatti perus- ja keskitasolle operatiivinen tuki Linux-järjestelmille, joka sisältää käynnissä olevien järjestelmien ja palveluiden tukemisen, yleisen seurannan ja analyysin sekä älykkään päätöksenteon, kun on kyse ongelmien nostamisesta ylemmille tukitiimille.

Katso seuraava video, joka opastaa sinut tutustumaan Linux Foundation -sertifiointiohjelmaan.

Tämä on tämän 10 opetusohjelman pitkän sarjan viimeinen artikkeli (osa 10). Tässä artikkelissa keskitymme shell-komentosarjaan ja Linux-tiedostojärjestelmien vianmääritykseen. Molemmat aiheet vaaditaan LFCS-sertifiointikokeeseen.

Terminaalien ja kuorien ymmärtäminen

Selvitetään ensin muutama käsite.

  1. Kuori on ohjelma, joka ottaa komentoja ja antaa ne suoritettavaan käyttöjärjestelmään.
  2. Pääte on ohjelma, jonka avulla voimme loppukäyttäjinä olla vuorovaikutuksessa kuoren kanssa. Yksi esimerkki päätelaitteesta on GNOME-pääte, kuten alla olevassa kuvassa on esitetty.

Kun aloitamme kuoren ensimmäisen kerran, se esittelee komentokehotteen (tunnetaan myös nimellä komentorivi), joka kertoo meille, että kuori on valmis aloittamaan komentojen vastaanottamisen tavallisesta syöttölaitteestaan, joka on yleensä näppäimistö.

Haluat ehkä viitata toiseen tämän sarjan artikkeliin (Käytä komentoa tiedostojen luomiseen, muokkaamiseen ja käsittelemiseen - osa 1) tarkastellaksesi hyödyllisiä komentoja.

Linux tarjoaa useita vaihtoehtoja kuorille, seuraavat ovat yleisimpiä:

Bash tarkoittaa Bourne Again Shell -sarjaa ja on GNU-projektin oletuskuori. Se sisältää hyödyllisiä ominaisuuksia Korn-kuoresta (ksh) ja C-kuoresta (csh) ja tarjoaa useita parannuksia samanaikaisesti. Tämä on oletuskuori, jota LFCS-sertifikaatin kattamat jakelut käyttävät, ja sitä käytetään tässä opetusohjelmassa.

Bourne SHell on vanhin kuori, ja siksi se on ollut oletuskuori useissa UNIX-tyyppisissä käyttöjärjestelmissä monien vuosien ajan.

Korn SHell on Unix-kuori, jonka David Korn kehitti Bell Labsissa 1980-luvun alussa. Se on taaksepäin yhteensopiva Bourne-kuoren kanssa ja sisältää monia C-kuoren ominaisuuksia.

Shell-komentosarja ei ole muuta eikä vähempää kuin tekstitiedosto, joka on muutettu suoritettavaksi ohjelmaksi, joka yhdistää komentot, jotka shell suorittaa toisensa jälkeen.

Shell-komentosarjojen perustiedot

Kuten aiemmin mainittiin, shell-komentosarja syntyy pelkkänä tekstitiedostona. Siten voidaan luoda ja muokata käyttämällä ensisijaista tekstieditoria. Harkitse vi/m: n käyttöä (katso vi-editorin käyttö - tämän sarjan osa 2), joka sisältää syntaksikorostuksen avuksesi.

Kirjoita seuraava komento luoda tiedosto nimeltä myscript.sh ja paina Enter.

# vim myscript.sh

Shell-komentosarjan ensimmäisen rivin on oltava seuraava (tunnetaan myös nimellä shebang ).

#!/bin/bash

Se "kertoo käyttöjärjestelmälle tulkin nimen, jota tulisi käyttää seuraavan tekstin suorittamiseen.

Nyt on aika lisätä komentomme. Voimme selventää jokaisen komennon tai koko komentosarjan tarkoituksen lisäämällä myös kommentteja. Huomaa, että kuori jättää huomiotta ne punnamerkillä # alkavat rivit (selittävät kommentit).

#!/bin/bash
echo This is Part 10 of the 10-article series about the LFCS certification
echo Today is $(date +%Y-%m-%d)

Kun komentosarja on kirjoitettu ja tallennettu, meidän on tehtävä siitä suoritettava.

# chmod 755 myscript.sh

Ennen komentosarjamme suorittamista meidän on sanottava muutama sana $PATH -ympäristömuuttujasta. Jos juoksemme,

echo $PATH

komentoriviltä näemme $PATH: sisällön kaksoispisteellä erotetun luettelon hakemistoista, joita haetaan, kun kirjoitamme suoritettavan ohjelman nimen. Sitä kutsutaan ympäristömuuttujaksi, koska se on osa kuoriympäristöä - joukko tietoja, jotka tulevat saataville kuorelle ja sen aliprosesseille, kun kuori käynnistetään ensimmäisen kerran.

Kun kirjoitamme komennon ja painamme Enter, kuori hakee kaikki muuttujassa $PATH luetellut hakemistot ja suorittaa ensimmäisen löydetyn esiintymän. Katsotaanpa esimerkki

Jos suoritettavia tiedostoja on kaksi samannimistä, yksi /usr/local/bin ja toinen /usr/bin , suoritetaan ensimmäisen hakemiston tiedosto ensinnäkin, kun taas toinen jätetään huomiotta.

Jos emme ole tallentaneet komentosarjaa johonkin $PATH -muuttujassa luetelluista hakemistoista, meidän on liitettävä ./ tiedostonimeen sen suorittamiseksi. Muuten voimme suorittaa sen aivan kuten tekisimme tavallisen komennon kanssa.

# pwd
# ./myscript.sh
# cp myscript.sh ../bin
# cd ../bin
# pwd
# myscript.sh

Aina kun sinun on määriteltävä eri toimintatavat komentosarjakomentosarjassa komennon onnistumisen tai epäonnistumisen seurauksena, määrität tällaiset ehdot if -konstruktion avulla. Sen perussyntaksi on:

if CONDITION; then 
	COMMANDS;
else
	OTHER-COMMANDS 
fi

Missä EHDOT voi olla jokin seuraavista (tässä mainitaan vain yleisimmät olosuhteet) ja arvioidaan totta, kun:

  1. [-a-tiedosto] → tiedosto on olemassa.
  2. [-d tiedosto] → tiedosto on olemassa ja se on hakemisto.
  3. [-f tiedosto] → tiedosto on olemassa ja se on tavallinen tiedosto.
  4. [-u tiedosto] → tiedosto on olemassa ja sen SUID (set user ID) -bitti on asetettu.
  5. [-g-tiedosto] → -tiedosto on olemassa ja sen SGID-bitti on asetettu.
  6. [-k-tiedosto] → -tiedosto on olemassa ja sen tahmea bitti on asetettu.
  7. [-r tiedosto] → tiedosto on olemassa ja se on luettavissa.
  8. [-s-tiedosto] → -tiedosto on olemassa eikä se ole tyhjä.
  9. [-w tiedosto] → tiedosto on olemassa ja se on kirjoitettava.
  10. [-x-tiedosto] on tosi, jos tiedosto on olemassa ja se voidaan suorittaa.
  11. [string1 = merkkijono2] → merkkijonot ovat samat.
  12. [merkkijono1! = merkkijono2] → merkkijonot eivät ole yhtä suuret.

[int1 op int2] tulisi olla osa edellistä luetteloa, kun taas seuraavat kohteet (esimerkiksi -eq -> ovat totta, jos int1 on yhtä suuri kuin int2 .) pitäisi olla " lapset " -luettelo [ int1 op int2 ] -kohdasta, jossa op on yksi seuraavista vertailuoperaattoreista.

  1. -eq -> on tosi, jos int1 on yhtä suuri kuin int2.
  2. -ne -> tosi, jos int1 ei ole sama kuin int2.
  3. -lt -> tosi, jos int1 on pienempi kuin int2.
  4. -le -> tosi, jos int1 on pienempi tai yhtä suuri kuin int2.
  5. -gt -> tosi, jos int1 on suurempi kuin int2.
  6. -ge -> tosi, jos int1 on suurempi tai yhtä suuri kuin int2.

Tämän silmukan avulla voidaan suorittaa yksi tai useampi komento jokaiselle arvoluettelon arvolle. Sen perussyntaksi on:

for item in SEQUENCE; do 
		COMMANDS; 
done

Missä kohde on yleinen muuttuja, joka edustaa kutakin arvoa sarjassa SEQUENCE jokaisen iteraation aikana.

Tämän silmukan avulla voidaan suorittaa sarja toistuvia komentoja, kunhan ohjauskomento suorittaa poistumistilan, joka on nolla (onnistuneesti). Sen perussyntaksi on:

while EVALUATION_COMMAND; do 
		EXECUTE_COMMANDS; 
done

Missä EVALUATION_COMMAND voi olla mikä tahansa komento, joka voi poistua onnistuneella ( 0 ) tai epäonnistumisella (muu kuin 0) , ja EXECUTE_COMMANDS voi olla mikä tahansa ohjelma, komentosarja tai kuorirakenne, mukaan lukien muut sisäkkäiset silmukat.

Esittelemme if-konstruktin ja for-silmukan käytön seuraavalla esimerkillä.

Luodaan tiedosto, jossa on luettelo palveluista, joita haluamme valvoa yhdellä silmäyksellä.

# cat myservices.txt

sshd
mariadb
httpd
crond
firewalld

Shell-komentosarjamme pitäisi näyttää.

#!/bin/bash

# This script iterates over a list of services and
# is used to determine whether they are running or not.

for service in $(cat myservices.txt); do
    	systemctl status $service | grep --quiet "running"
    	if [ $? -eq 0 ]; then
            	echo $service "is [ACTIVE]"
    	else
            	echo $service "is [INACTIVE or NOT INSTALLED]"
    	fi
done

1). For -silmukka lukee myservices.txt -tiedoston LIST-elementin kerrallaan. Tuo yksittäinen elementti on merkitty yleisellä muuttujalla nimeltä palvelu. LIST täytetään tulosteella,

# cat myservices.txt

2). Yllä oleva komento on sulkeissa ja sitä edeltää dollarin merkki osoittamaan, että se tulisi arvioida täyttämään LIST, jonka toistamme.

3). Seuraava komento suoritetaan jokaiselle LIST-elementille (eli palvelumuuttujan jokaiselle esiintymälle).

# systemctl status $service | grep --quiet "running"

Tällä kertaa meidän on edeltävä geneeristä muuttujaa (joka edustaa kutakin LIST -elementin elementtiä) dollarin merkillä osoittamaan, että se on muuttuja, ja siksi sen arvoa kussakin iteroinnissa tulisi käyttää. Lähtö johdetaan sitten grepiin.

Lippua –quiet käytetään estämään grep -näyttöä näyttämästä rivejä, joissa esiintyvä sana esiintyy. Kun näin tapahtuu, yllä oleva komento palauttaa poistumistilan 0 (jota edustaa $? if-konstruktissa), mikä varmistaa, että palvelu on käynnissä.

Poistumistila, joka on erilainen kuin 0 (eli käynnissä olevaa sanaa ei löydy systemctl status $service -ulostulosta) osoittaa, että palvelu ei ole käynnissä.

Voisimme mennä askeleen pidemmälle ja tarkistaa, onko myservices.txt olemassa, ennen kuin yritämme edes syöttää for-silmukkaa.

#!/bin/bash

# This script iterates over a list of services and
# is used to determine whether they are running or not.

if [ -f myservices.txt ]; then
    	for service in $(cat myservices.txt); do
            	systemctl status $service | grep --quiet "running"
            	if [ $? -eq 0 ]; then
                    	echo $service "is [ACTIVE]"
            	else
                    	echo $service "is [INACTIVE or NOT INSTALLED]"
            	fi
    	done
else
    	echo "myservices.txt is missing"
fi

Haluat ehkä ylläpitää luetteloa isänteistä tekstitiedostossa ja määrittää komentosarjan avulla silloin tällöin, ovatko ne pingattavissa vai ei (korvaa omien isäntien sisältö ja yritä itse ).

Sisäänrakennettu read shell -komento käskee while-silmukan lukemaan myhostit rivi riviltä ja määrittää kunkin rivin sisällön muuttujan isännälle, joka sitten välitetään ping -komennolle.

#!/bin/bash

# This script is used to demonstrate the use of a while loop

while read host; do
    	ping -c 2 $host
done < myhosts

Lue myös :

  1. Opi Shell Scripting: Opas aloittelijoista järjestelmänvalvojaan
  2. 5 Shell-komentosarjaa Shell-ohjelmoinnin oppimiseksi

Tiedostojärjestelmän vianmääritys

Vaikka Linux on erittäin vakaa käyttöjärjestelmä, jos se kaatuu jostain syystä (esimerkiksi virtakatkoksen vuoksi), yhtä (tai useampaa) tiedostojärjestelmääsi ei pureta kunnolla ja tarkistetaan siten virheiden varalta automaattisesti, kun Linux käynnistetään uudelleen.

Lisäksi joka kerta, kun järjestelmä käynnistyy normaalin käynnistyksen aikana, se tarkistaa tiedostojärjestelmien eheyden ennen niiden asentamista. Molemmissa tapauksissa tämä tehdään työkalulla nimeltä fsck (" tiedostojärjestelmän tarkistus ").

fsck ei vain tarkista tiedostojärjestelmien eheyttä, vaan myös yrittää korjata vioittuneet tiedostojärjestelmät, jos sitä kehotetaan tekemään. Vahingon vakavuudesta riippuen fsck voi onnistua tai ei; kun se tapahtuu, palautetut tiedostojen osat sijoitetaan hakemistoon lost + found , joka sijaitsee kunkin tiedostojärjestelmän juuressa.

Viimeisenä mutta ei vähäisimpänä, meidän on huomattava, että epäjohdonmukaisuuksia voi myös tapahtua, jos yritämme poistaa USB-aseman, kun käyttöjärjestelmä kirjoittaa siihen vielä, ja voi jopa johtaa laitteistovaurioihin.

Fsck: n perussyntaksi on seuraava:

# fsck [options] filesystem

Fsck-tiedostojärjestelmän tarkistamiseksi meidän on ensin irrotettava se.

# mount | grep sdg1
# umount /mnt
# fsck -y /dev/sdg1

-y -lipun lisäksi voimme käyttää -a -vaihtoehtoa tiedostojärjestelmien automaattiseen korjaamiseen kysymättä mitään ja pakottaa tarkistuksen silloinkin, kun tiedostojärjestelmä näyttää puhtaalta.

# fsck -af /dev/sdg1

Jos haluamme vain selvittää, mikä on vialla (yrittämättä korjata mitään toistaiseksi), voimme suorittaa fsck: n -n -vaihtoehdolla, joka tuottaa tiedostojärjestelmään liittyvät ongelmat vakiotulosteeseen.

# fsck -n /dev/sdg1

Fsck: n tulosteen virheilmoituksista riippuen tiedämme, voimmeko yrittää ratkaista ongelman itse vai viedä se suunnittelutiimeille suorittamaan laitteiston lisätarkistuksia.

Yhteenveto

Olemme saapuneet tämän 10-artikkeli -sarjan loppuun, jossa olemme yrittäneet kattaa LFCS -tentin läpäisemiseen vaaditut peruskompetentit.

Ilmeisistä syistä ei ole mahdollista käsitellä näiden aiheiden kaikkia näkökohtia yhdessä opetusohjelmassa, ja siksi toivomme, että nämä artikkelit ovat asettaneet sinut oikealle tielle kokeilla itse uusia asioita ja jatkaa oppimista.

Jos sinulla on kysyttävää tai kommentteja, ne ovat aina tervetulleita - joten älä epäröi antaa meille riviä alla olevan lomakkeen kautta!