Se afișează postările cu eticheta Linux. Afișați toate postările
Se afișează postările cu eticheta Linux. Afișați toate postările

vineri, 30 martie 2012

Cele 6 etape ale procesului de boot-are Linux (Secvenţa de start)



 Traducerea articolului:
6 Stages of Linux Boot Process (Startup Sequence) 

Din momentul în care apeşi butonul de pornire al calculatorului vor trece câteva secunde sau minute până când vei vedea pe ecran promptul de login în Linux.

Te-ai întrebat vreodată ce se întâmplă în spatele scenei din momentul în care apeşi butonul de pornire al sistemului până în momentul în care apare promptul de logare?


Iată cei sase (6) paşi importanţi al unui proces tipic de butare (boot-are) Linux.


1. BIOS

  • BIOS este acronimul pentru Basic Input/Output System.
  • Efectuează unele verificări de integritate a sistemului.
  • Caută, încarcă şi execută programul boot loader
  • Caută boot loader-ul pe floppy, cd-rom sau pe hard. Se poate apăsa o tastă în timpul procesului de pornire BIOS (de obicei F12 of F2) pentru a schimba ordinea de butare.
  • După ce programul boot loader este detectat şi încărcat în memorie, BIOS-ul predă controlul către boot loader.
  • Simplificând, putem spune că BIOS-ul încarcă şi execută boot loader-ul din MBR.

2. MBR

  • MBR este acronimul pentru Master Boot Record.
  • Este localizat în primul sector al discului butabil (boot-abil). De obicei: /dev/hda sau /dev/sda
  • MBR-ul are o dimensiune mai mică de 512 bytes şi este compus din trei secţiuni: 1) primary boot loader info - 1st 446 bytes 2) partition table info - următorii 64 bytes 3) mbr validation check – ultimii 2 bytes.
  • Conţine informaţii despre GRUB (sau LILO pe sistemele vechi).
  • Simplificând, putem spune că MBR ul încarcă şi execută  boot loader-ul GRUB.

3. GRUB

  • GRUB este acronimul pentru Grand Unified Bootloader.
  • Dacă pe sistem sunt instalate mai multe imagini de kernel, din GRUB se poate selecta care dintre acestea va fi executată.
  • GRUB afişează un meniu şi aşteaptă pentru câteva secunde. Daca nu este selectat nicio imagine de kernel, va încarcă imaginea kernelului implicit după cum este ea specificata în fişierul de configurare GRUB.
  • GRUB poate adresa sistemul de fişiere.
  • Fişierul de configurare GRUB este /boot/grub/grub.conf (/etc/grub.conf este o trimitere (link) către acest fişier). Exemplu de fişier de configurare GRUB (grub.conf pentru distribuţia CentOS):
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-194.el5PAE)
          root (hd0,0)
          kernel /boot/vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/
          initrd /boot/initrd-2.6.18-194.el5PAE.img
  • După cum se poate observa, în fişierul de configurare se specifica locul în care se găsesc imaginile kernelului şi ale initrd.
  • Simplificând, putem spune că GRUB-ul încarcă şi execută imaginile kernelului şi initrd.

4. Kernel

  • Montează sistemul de fişiere root după cum este el specificat în fişierul de configuraţie: “root=”.
  • Kernelul execută programul /sbin/init.
  • Deoarece init este primul program executat de kernelul de Linux are identificatorul de proces (process id) (PID) 1. Se poate observa acest lucru executând comanda: ‘ps -ef | grep init’.
  • Initrd este acronimul pentru Initial RAM Disk.
  • Initrd este folosit de către kernel ca sistem temporar de fişiere până în momentul în care kernelul a butat (boot-at) şi sistemul de fişiere root real este montat. El conţine de asemenea driverele necesare compilate înăuntru, ceea ce ajuta la accesarea partiţiilor şi a altor dispozitive hardware.

5. Init

  • Procesul init decide nivelul de rulare (run level) după ce citeşte fişierul /etc/inittab.
  • Nivelele de rulare disponibile sunt:
    • 0 – halt
    • 1 – Single user mode
    • 2 – Multiuser, without NFS
    • 3 – Full multiuser mode
    • 4 – unused
    • 5 – X11
    • 6 – reboot
  • Procesul init identifica initlevel-ul implicit (/etc/inittab) şi porneşte toate programele asociate.
  • Pentru a identifica nivelul de rulare implicit se poate folosi următoarea comandă: ‘grep initdefault /etc/inittab’.
  • De obicei nivelul de rulare implicit este 3 sau 5.

6. Programele din nivelele de rulare (Runlevel programs)

  • În timpul butării (boot-arii) SO Linux, diverse programe sunt pornite. (De exemplu, pe ecran ar putea să apară la un anumit moment următorul mesaj “starting sendmail …. OK” ce indică faptul că serviciul sendmail a fost pornit). Aceste programe sunt programele executate din directorul definit de către nivelul de rulare asociat.
  • În funcţie de initlevel, sistemul va executa programele ce se află în unul dintre următoarele directoare:
    • Run level 0 – /etc/rc.d/rc0.d/
    • Run level 1 – /etc/rc.d/rc1.d/
    • Run level 2 – /etc/rc.d/rc2.d/
    • Run level 3 – /etc/rc.d/rc3.d/
    • Run level 4 – /etc/rc.d/rc4.d/
    • Run level 5 – /etc/rc.d/rc5.d/
    • Run level 6 – /etc/rc.d/rc6.d/
  • De notat că există şi legături simbolice (symbolic links) către aceste directoare în directorul /etc. De exemplu /etc/rc0.d este legat (linked) de /etc/rc.d/rc0.d.
  • În directoarele /etc/rc.d/rc*.d/, se găsesc programe al căror nume începe cu S sau K.
  • Programele care încep cu S sunt rulate în cursul procesului de pornire al sistemului. S - startup.
  • Programele care pornesc cu K sunt rulate în cursul procesului de oprire al sistemului. K - kill.
  • În numele programelor este specificat şi numărul de secvenţa imediat după litera S sau K. Numărul de secvenţa determină ordinea în care programele trebuie pornite sau oprite.
  • De exemplu, S12syslog va porni daemon-ul syslog în poziţia a 12-a. S80sendmail  va porni daemon-ul sendmail  în poziţia a 80-a. Deci, programul syslog  va porni înaintea sendmail-ului.
Iată ce se întâmplă în timpul procesului de butare (boot-are) Linux.

marți, 21 februarie 2012

5 exemple practice de utilizare a comenzii ‘fuser’ în Linux

Traducerea articolului:
5 Practical Linux fuser Command Examples 

Utilitarul fuser’ din Linux este un instrument foarte puternic. După cum sugerează şi numele, el oferă informaţii despre utilizatorul sau despre procesul care foloseşte un anumit fişier sau director.
Funcţionalitatea  utilitarului 'fuser' nu se rezumă însă doar la oferirea informaţiilor despre procese. Acest articol explică cum poate fi folosit utilitarul 'fuser' cu ajutorul a 5 exemple practice.


1. Cine foloseşte un fişier sau un director?

Aceasta este utilitatea de bază a comenzii 'fuser': identifică ce procese folosesc un anumit fişier sau director.
$ fuser  .
./:                   3965c  4175c  4281c  4334c  4337c
În exemplul de mai sus utilitarul 'fuser' a fost rulat pentru a găsi toate procesele ce folosesc directorul curent ‘./'’
Observăm că output-ul comenzii consistă într-o enumerare de identificatoare de procese (PID-uri), dar toate PID-urile sunt urmate de caracterul ‘c’. Acesta indică tipul de acces. Tipul de acces poate fi:
  • c      directorul curent
  • e      executabilul rulat
  • f      fişier deschis. f este omis în modul de afişare implicit
  • F     fişier deschis pentru scriere. F este omis în modul de afişare implicit
  • r      directorul rădăcină
  • m     fişier mmap sau librărie partajată
‘c’ comunică faptul că procesele listate folosesc directorul drept director curent
Folosiţi opţiunea '–v' pentru a obţine informaţii detaliate:
$ fuser -v ./
           USER        PID ACCESS COMMAND
./:       himanshu   3965 ..c..    bash
          himanshu   4175 ..c..    gedit
          himanshu   4281 ..c..    bash
          himanshu   4334 ..c..  socket_serv
          himanshu   4337 ..c..    bash
Putem observa că rularea comenzii 'fuser' având drept parametru directorul curent permite aflarea unor informaţii suplimentare cu privire la procesele ce folosesc acest director.

2. comanda 'fuser' având drept parametru un executabil

Socket_serv este un executabil (un program scris în C care ascultă pe un port TCP)
$ ./socket_serv
În cazul în care apelam comanda 'fuser' având ca parametru acest executabil vom obţine următorul output:
$ fuser -v socket_serv
                     USER        PID    ACCESS       COMMAND
socket_serv:         himanshu   4334    ...e.        socket_serv
În acest caz ‘e’ indică faptul că fişierul este executabil.

3. Verificarea proceselor ce utilizează socket-uri TCP/UDP

Folosind comanda 'fuser' putem verifica de asemenea ce procese utilizează socket-uri TCP/UDP. Programul de mai sus, socket_serv, deschide portul TCP 5000.  
Putem folosi comanda 'fuser' având drept parametru portul tcp.
$ fuser -v -n tcp 5000
                       USER        PID ACCESS COMMAND
5000/tcp:            himanshu   4334   F....  socket_serv
Vom obţine informaţii detaliate despre procesul ce rulează pe portul 5000.
În afară de cazurile prezentate, putem folosi parametrul ‘-m’ pentru a afişa toate procesele ce folosesc sisteme de fişiere montate (de exemplu: drive USB)

4. Oprirea proceselor care utilizează un anumit program

Până acum am aflat că utilitarul 'fusar' oferă informaţii despre procese care utilizează fişiere, directoare, socket-uri, etc.… Puterea comenzii însă nu se limitează doar la afişarea informaţiilor despre procese. Folosind aceasta comanda se pot, de asemenea, opri acele procese.
Am aflat că un server TCP rulează pe sistem si accesează fişierul binar socket_serv. Putem încerca acum să oprim procesul ce utilizează acest fişier folosind 'fuser'.
$ fuser -v -k socket_serv
                      USER        PID ACCESS COMMAND
socket_serv:         himanshu   4334 ...e.   socket_serv
De remarcat că s-a utilizat paramentrul ‘-k’ pentru a opri procesul ce utilizează fişierul ‘socket_serv’.  În terminalul în care serverul rulează va apare:
$ ./socket_serv
Killed

5. Oprirea interactivă a unui proces utilizând 'fuser'

În exemplul de mai sus am văzut că opţiunea ‘-k’ este folosită în cazul în care dorim să oprim procesele ce utilizează un anume fişier. Dacă însă dorim să evitam oprirea accidentală a unui proces util, acesta opţiune se poate folosi împreună cu opţiunea ‘-i’. Dacă folosim această opţiune, comanda ‘fuser’ va rula în mod interactiv şi va solicita aprobare înainte de oprirea vreunui proces.

Exemplu:
$ fuser -v -k -i socket_serv
                      USER        PID ACCESS COMMAND
socket_serv:         himanshu   5643 ...e.   socket_serv
Kill process 5643 ? (y/N) y
Se poate observa că folosind optiunea ‘-k’ se pot opri selectiv procesele ce utilizează un anumit fişier.
Să presupunem acum că dorim să ştergem un fişier utilizat de mai multe procese. În acest caz  se poate folosi comanda ‘fuser’ pentru a opri toate procesele (sau anumite procese) ce utilizează acest fişier.
$ fuser -v -k -i ./
           USER        PID ACCESS COMMAND
./:       himanshu   3965 ..c..    bash
          himanshu   4175 ..c..    gedit
          himanshu   4281 ..c..    bash
          himanshu   4334 ..c..  socket_serv
          himanshu   4337 ..c..    bash
Kill process 3965 ? (y/N) y
Kill process 4175 ? (y/N) y
Kill process 4281 ? (y/N) y
Kill process 4334 ? (y/N) y
Kill process 4337 ? (y/N) y
De remarcat că utilizarea parametrului ‘-k’ transmite un semnal SIGKILL către procesul ce utilizează un anumit fişier. Se poate folosi opţiunea -<SEMNAL>’ pentru a transmite oricare alt semnal. Lista semnalelor pe care comanda fuser le poate transmite este următoarea:
$ fuser -l
HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
UNUSED
 
De exemplu, următoarea comandă transmite semnalul SIGHUP în locul semnalului SIGKILL implicit, când se foloseşte opţiunea ‘-k’.
 
$ fuser -v  -k -HUP -i ./

duminică, 13 februarie 2011

Basic IPv4 config – Linux/UNIX

Pentru diferite distributii Linux/UNIX, mai jos se afla modalitatile de configurare minimala a retelei.

Date initiale:

a) interfata ce trebuie configurata: eth0

b) nu exista probleme de nivel fizic (cablu, probleme interfata defecta, etc)

c) cablul este straight (pt conexiunea cu un switch) sau cross-over (pt conexiunea cu un alt PC, router, etc)

d) in cazul configurarii statice:

- IP: 172.16.1.10

- Netmask: 255.255.255.0

- Gateway: 172.16.1.1

- DNS: 193.19.192.15, 193.19.192.16

- Hostname: server

- MAC: 00:0E:2E:90:D8:11

Configurare on-the-fly (non-persistenta)

# ifconfig eth0 hw ether 00:0E:2E:90:D8:11

# ifconfig eth0 172.16.1.10 netmask 255.255.255.0

# route del default gw

# route add default gw 172.16.1.1

  1. Fedora, CentOS, Mandriva, Red Hat

/etc/sysconfig/network-scripts/ifcfg-eth0

Static config

Dynamic config (dhcp)

DEVICE=eth0

BOOTPROTO=static

HWADDR=00:0E:2E:90:D8:11

IPADDR=172.16.1.10

NETMASK=255.255.255.0

NETWORK=172.16.1.0

BROADCAST=172.16.1.255

ONBOOT=yes

DNS1=193.19.192.15

DNS2=193.19.192.16

DEVICE=eth0

BOOTPROTO=dhcp

HWADDR=00:0E:2E:90:D8:11

ONBOOT=yes

/etc/sysconfig/network

Static config

Dynamic config (dhcp)

NETWORKING=yes

GATEWAY=172.16.1.1

NETWORKING=yes

# /etc/init.d/network restart

  1. Debian, Ubuntu, Kubuntu, Xubuntu, Damn Small Linux (DSL), Linux Mint

/etc/network/interfaces

Static config

Dynamic config (dhcp)

auto lo
iface lo inet loopback

auto eth0

iface eth0 inet static

hwaddress ether 01:02:03:04:05:06

address 172.16.1.10

netmask 255.255.255.0

network 172.16.1.0

broadcast 172.16.1.255

gateway 172.16.1.1

dns-nameservers 193.19.192.15

auto lo
iface lo inet loopback

auto eth0

iface eth0 inet dhcp

hwaddress ether 01:02:03:04:05:06

  1. Gentoo

/etc/conf.d/net

Static config

Dynamic config (dhcp)

config_eth0=( "172.16.1.10/24" )
routes_eth0=( "default via 172.16.1.1" )
mac_eth0="01:02:03:04:05:06"

config_eth0=( "dhcp" )
dhcpcd_eth0="-t 10" #timeout after 10sec

mac_eth0="01:02:03:04:05:06"

/etc/resolv.conf

Static config

nameserver 193.19.192.15

nameserver 193.19.192.16

  1. Slackware

/etc/rc.d/rc.inet1.conf

Static config

Dynamic config (dhcp)

IPADDR[0]="172.16.1.10"
NETMASK[0]="255.255.255.0"
USE_DHCP[0]="no"
DHCP_HOSTNAME[0]=""
GATEWAY="172.16.1.1"

IPADDR[0]=""
NETMASK[0]=" "
USE_DHCP[0]="yes"
DHCP_HOSTNAME[0]="server"
GATEWAY=""

/etc/resolv.conf

Static config

nameserver 193.19.192.15

nameserver 193.19.192.16

  1. OpenSUSE, SUSE Linux Enterprise

/etc/sysconfig/network/ifcfg-eth0

/etc/sysconfig/network/config

Static config

Dynamic config (dhcp)

STARTMODE=onboot

BOOTPROTO=static
ETHTOOL_OPTIONS=''
IPADDR=172.16.1.10
MTU=1500
NAME='Broadcom NetXtreme II BCM5708 Gigabit Ethernet'
NETMASK=255.255.255.0

BROADCAST=172.16.1.255
NETWORK=172.16.1.0

STARTMODE=onboot

BOOTPROTO=dhcp

/etc/sysconfig/network/routes

Static config

sefault 172.16.1.1

/etc/resolv.conf

Static config

nameserver 193.19.192.15

nameserver 193.19.192.16

  1. Solaris

/etc/hostname.eth0

Static config

Dynamic config (dhcp)

  1. FreeBSD

/etc/rc.conf

Static config

Dynamic config (dhcp)

hostname="server"

ifconfig_eth0="inet 172.16.1.1 netmask 255.255.255.0 up"

defaultrouter="172.16.1.1"

 

  1. OpenBSD

/etc/hostname.eth0

Static config

Dynamic config (dhcp)

inet 172.16.1.10 255.255.255.0 NONE

 

/etc/mygate

Static config

Dynamic config (dhcp)

172.16.1.1

 

  1. NetBSD

/etc/ifconfig.eth0

Static config

Dynamic config (dhcp)

inet 172.16.1.10 netmask 255.255.255.0 media 100baseTX