Secuencia de arranque. Marcha y paro de los servicios

per Victor Carceler darrera modificació 2020-03-25T15:30:31+01:00

Cuando se enciende un sistema informático se inicia la secuencia de arranque. La secuencia de arranque es variable en función de la plataforma (hardware y software) en la que tiene lugar. Una posible división a grosso modo puede ser:

Pasos:

  1. Se pulsa el botón de encendido.
  2. El hardware comienza a funcionar, su primer trabajo consiste en ejecutar el POST (power on self test)
  3. Se carga y ejecuta el gestor de arranque
  4. Se carga y ejecuta el sistema operativo

Power on self test

Cuando el hardware al recibir alimentación comienza a funcionar, su primera tarea consiste en realizar unas pruebas de autodiagnóstico. Si las comprobaciones no encuentran ningún error, el dispositivo reanuda su funcionamiento normal. En el caso de la CPU, una vez que completa su inicialización comienza a cargar instrucciones desde la memoria principal y ejecutarlas. La dirección de memoria a la que la CPU acude por primera vez para cargar instrucciones corresponde a un área de memoria no volátil. En el caso de los PCs este área de memoria corresponde a la BIOS (Basic Input Output System).

En otras plataformas, el software que se almacena en esta memoria recibe otro nombre. Por ejemplo, en algunas máquinas de Apple y Sun se utiliza Open Firmware. En los nuevos Mac sobre Intel se utiliza EFI.

El código que carga y ejecuta la CPU tiene por función:

  • Verificar la integridad del propio código de la BIOS
  • Encontrar, medir y verificar la memoria principal del sistema
  • Descubrir, inicializar y catalogar los diferentes buses del sistema
  • Ceder el control a otras posibles BIOS (controladoras RAID, SCSI...)
  • Proporcionar al usuario un entorno de configuración (seleccionar la unidad de arranque, hora del reloj de tiempo real...)
  • Identificar, organizar y seleccionar los dispositivos preparados para el arranque
  • Construir el entorno de ejecución que precisa el sistema operativo


Los sistemas operativos modernos, aunque reciben la información (de memoria, buses y dispositivos) recopilada por la  BIOS, el propio sistema operativo realiza su propio examen del sistema. Aún así, la BIOS sigue teniendo un papel principal en el arranque, al seleccionar el dispositivo desde el que se cargará el gestor de arranque.

Gestor de arranque

El gestor de arranque (bootloader) está almacenado en el MBR (Master Boot Record). La BIOS carga su contenido en memoria principal, y cede el control del sistema, al iniciar su ejecución.

La función principal del gestor de arranque es encontrar la imagen del núcleo, cargarla en memoria principal y comenzar su ejecución. Para ello puede interaccionar con el usuario (permitiendo escoger entre diferentes núcleos alternativos), o incluso alterar la tabla de particiones del disco (para ocultar, hacer visible o cambiar alguna partición).

Algunos de los gestores de arranque más populares son:

NTLOADER
Gestor de arranque nativo de Windows. También puede arrancar GNU/Linux
LILO
Linux Loader es un gestor de arranque libre que puede cargar tanto Windows como GNU/Linux (u otros sistemas operativos). Es flexible y fácil de utilizar
GRUB
Grand Unified Bootloader es el gestor de arranque oficial del proyecto GNU. Es muy flexible y potente.

 

Secuencia de arranque del sistema operativo

Cuando el gestor de arranque carga la imagen del núcleo en memoria principal, cede el control del sistema al núcleo y comienza la ejecución del sistema operativo.

El sistema operativo inicia su propia secuencia de arranque, en la que normalmente detecta y configura el hardware disponible. Después crea el primer procesosiguiendo la ejecución de uno o varios scripts, inicia los servicios que estén configurados.

En Unix hay dos estilos de arranque diferenciados:

Estilo BSD
Los scripts /etc/rc y /etc/rc.local controlan el arranque del sistema
Estilo System V
Existen diferentes niveles de ejecución. En cada nivel de ejecución hay scripts que controlan qué servicios se deben iniciar y detener

Niveles de ejecución

Un nivel de ejecución (runlevel) es un estado de funcionamiento del sistema informático. En cada nivel de ejecución, el sistema tiene en marcha diferentes servicios. Los niveles de ejecución son configurables, se pueden definir nuevos y cambiar el significado de los que están configurados.

Los niveles de ejecución standard son:

runlevelFunción
0
Máquina detenida
1 Modo monousuario (se puede utilizar para recuperar una máquina de la que se desconoce
el password de administrador)
2
Modo multiusuario sin red
3 Modo multiusuario con red
4
5 Modo multiusuario con red y entorno gráfico (X Window)
6 Reinicio del sistema

Por cada nivel de ejecución existe un directorio que contiene ficheros (enlaces simbólicos) que controlan el arranque y paro de los servicios.

Arranque de GNU/Linux

El sistema GNU/Linux puede arrancar desde una partición primaria o lógica. Normalmente se utiliza como gestor de arranque LILO o GRUB. En el propio gestor de arranque es posible añadir parámetros para el núcleo (con el parámetro single, el núcleo arranca en modo monousuario).

LILOPARÁMETROS PARA EL KERNEL
lilo_knoppix1.png lilo_knoppix_F3.png

El gestor de arranque carga en memoria la imagen del kernel (normalmente /boot/vmlinuz), la descomprime y la ejecuta. El kernel toma el control y comienza a detectar e inicializar el hardware. Normalmente muestra por pantalla, aunque puede depender de la configuración, mensajes indicando las operaciones que realiza.

El comando dmesg vuelca  los mensajes generados por el kernel durante su arranque. En los ficheros de registro (/var/log) se puede encontrar más información detallada.

La salida proporcionada por una de las máquinas de la escuela es:

Linux version 2.6.12-12mdksmp (apatard@n1.mandriva.com) (gcc version 4.0.1 (4.0.1-5mdk for Mandriva Linux release 2006.0)) #1 SMP Fri Sep 9 17:43:23 CEST 2005
BIOS-provided physical RAM map:
BIOS-e820: 0000000000000000 - 000000000009f400 (usable)
BIOS-e820: 000000000009f400 - 00000000000a0000 (reserved)
BIOS-e820: 00000000000e4400 - 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 - 000000003fff0000 (usable)
BIOS-e820: 000000003fff0000 - 000000003ffffc00 (ACPI data)
BIOS-e820: 000000003ffffc00 - 0000000040000000 (ACPI NVS)
BIOS-e820: 00000000fec00000 - 00000000fec10000 (reserved)
BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved)
BIOS-e820: 00000000fff00000 - 0000000100000000 (reserved)
127MB HIGHMEM available.
896MB LOWMEM available.
found SMP MP-table at 000f6900
On node 0 totalpages: 262128
DMA zone: 4096 pages, LIFO batch:1
Normal zone: 225280 pages, LIFO batch:31
HighMem zone: 32752 pages, LIFO batch:15
DMI 2.3 present.
ACPI: RSDP (v000 INTEL ) @ 0x000f6910
ACPI: RSDT (v001 INTEL 024B 0x00000001 PTL 0x00000000) @ 0x3fffa25c
ACPI: FADT (v001 INTEL 024B 0x00000001 PTL 0x00000000) @ 0x3ffffafa
ACPI: MADT (v001 INTEL 024B 0x00000001 PTL 0x00000000) @ 0x3ffffb6e
ACPI: BOOT (v001 INTEL 024B 0x00000001 PTL 0x00000000) @ 0x3ffffbd8
ACPI: DSDT (v001 INTEL 024B 0x00000001 MSFT 0x0100000a) @ 0x00000000
ACPI: PM-Timer IO Port: 0x404
ACPI: Local APIC address 0xfee00000
ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)
Processor #0 6:8 APIC version 17
ACPI: LAPIC (acpi_id[0x01] lapic_id[0x03] enabled)
Processor #3 6:8 APIC version 17
ACPI: LAPIC_NMI (acpi_id[0x00] high edge lint[0x1])
ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
Using ACPI for processor (LAPIC) configuration information
Intel MultiProcessor Specification v1.4
Virtual Wire compatibility mode.
OEM ID: INTEL Product ID: STL2 APIC at: 0xFEE00000
I/O APIC #4 Version 17 at 0xFEC00000.
I/O APIC #5 Version 17 at 0xFEC01000.
Enabling APIC mode: Flat. Using 2 I/O APICs
Processors: 2
Allocating PCI resources starting at 40000000 (gap: 40000000:bec00000)
Built 1 zonelists
mapped APIC to ffffd000 (fee00000)
mapped IOAPIC to ffffc000 (fec00000)
mapped IOAPIC to ffffb000 (fec01000)
Initializing CPU#0
Kernel command line: auto BOOT_IMAGE=linux root=801 acpi=ht resume=/dev/sda5 splash=silent
bootsplash: silent mode.
PID hash table entries: 4096 (order: 12, 65536 bytes)
Detected 1000.034 MHz processor.
Using pmtmr for high-res timesource
Console: colour dummy device 80x25
Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
Memory: 1033356k/1048512k available (2451k kernel code, 14376k reserved, 788k data, 296k init, 131008k highmem, 0k BadRAM)
Checking if this processor honours the WP bit even in supervisor mode... Ok.
Calibrating delay loop... 1966.08 BogoMIPS (lpj=983040)
Mount-cache hash table entries: 512
CPU: After generic identify, caps: 0387fbff 00000000 00000000 00000000 00000000 00000000 00000000
CPU: After vendor identify, caps: 0387fbff 00000000 00000000 00000000 00000000 00000000 00000000
CPU: L1 I cache: 16K, L1 D cache: 16K
CPU: L2 cache: 256K
CPU serial number disabled.
CPU: After all inits, caps: 0383fbff 00000000 00000000 00000040 00000000 00000000 00000000
Intel machine check architecture supported.
Intel machine check reporting enabled on CPU#0.
Enabling fast FPU save and restore... done.
Enabling unmasked SIMD FPU exception support... done.
Checking 'hlt' instruction... OK.
CPU0: Intel Pentium III (Coppermine) stepping 0a
Enabling SMP...
Booting processor 1/0 eip 3000
Initializing CPU#1
Calibrating delay loop... 1994.75 BogoMIPS (lpj=997376)
CPU: After generic identify, caps: 0387fbff 00000000 00000000 00000000 00000000 00000000 00000000
CPU: After vendor identify, caps: 0387fbff 00000000 00000000 00000000 00000000 00000000 00000000
CPU: L1 I cache: 16K, L1 D cache: 16K
CPU: L2 cache: 256K
CPU serial number disabled.
CPU: After all inits, caps: 0383fbff 00000000 00000000 00000040 00000000 00000000 00000000
Intel machine check architecture supported.
Intel machine check reporting enabled on CPU#1.
CPU1: Intel Pentium III (Coppermine) stepping 0a
Total of 2 processors activated (3960.83 BogoMIPS).
ENABLING IO-APIC IRQs
..TIMER: vector=0x31 pin1=-1 pin2=0
...trying to set up timer (IRQ0) through the 8259A ...
..... (found pin 0) ...works.
checking TSC synchronization across 2 CPUs: passed.
Enabling SMP...
Brought up 2 CPUs
CPU0 attaching sched-domain:
domain 0: span 00000001
groups: 00000001
domain 1: span 00000003
groups: 00000001 00000002
CPU1 attaching sched-domain:
domain 0: span 00000002
groups: 00000002
domain 1: span 00000003
groups: 00000002 00000001
checking if image is initramfs...it isn't (no cpio magic); looks like an initrd
Freeing initrd memory: 349k freed
NET: Registered protocol family 16
PCI: PCI BIOS revision 2.10 entry at 0xfdb57, last bus=1
PCI: Using configuration type 1
mtrr: v2.0 (20020519)
ACPI: Subsystem revision 20050309
ACPI: Interpreter disabled.
Linux Plug and Play Support v0.97 (c) Adam Belay
pnp: PnP ACPI: disabled
PnPBIOS: Disabled
PCI: Probing PCI hardware
PCI: Probing PCI hardware (bus 00)
Boot video device is 0000:00:02.0
PCI: Discovered peer bus 01
PCI->APIC IRQ transform: 0000:00:02.0[A] -> IRQ 19
PCI->APIC IRQ transform: 0000:00:03.0[A] -> IRQ 18
PCI->APIC IRQ transform: 0000:01:04.0[A] -> IRQ 16
PCI->APIC IRQ transform: 0000:01:04.1[B] -> IRQ 17
Simple Boot Flag at 0x7d set to 0x1
apm: BIOS not found.
audit: initializing netlink socket (disabled)
audit(1138621782.685:0): initialized
highmem bounce pool size: 64 pages
VFS: Disk quotas dquot_6.5.1
Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)
devfs: 2004-01-31 Richard Gooch (rgooch@atnf.csiro.au)
devfs: boot_options: 0x0
Initializing Cryptographic API
vesafb: framebuffer at 0xfa000000, mapped to 0xf8880000, using 3750k, total 4096k
vesafb: mode is 800x600x16, linelength=1600, pages=3
vesafb: protected mode interface info at c000:479b
vesafb: scrolling: redraw
vesafb: Truecolor: size=0:5:6:5, shift=0:11:5:0
bootsplash 3.1.6-2004/03/31: looking for picture...<6> silentjpeg size 34430 bytes,<6>...found (800x600, 34382 bytes, v3).
Console: switching to colour frame buffer device 93x30
fb0: VESA VGA frame buffer device
isapnp: Scanning for PnP cards...
isapnp: No Plug & Play device found
Real Time Clock Driver v1.12
PNP: No PS/2 controller found. Probing ports directly.
serio: i8042 AUX port at 0x60,0x64 irq 12
serio: i8042 KBD port at 0x60,0x64 irq 1
Serial: 8250/16550 driver $Revision: 1.90 $ 8 ports, IRQ sharing enabled
ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
io scheduler noop registered
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered
RAMDISK driver initialized: 16 RAM disks of 32000K size 1024 blocksize
pktcdvd: v0.2.0a 2004-07-14 Jens Axboe (axboe@suse.de) and petero2@telia.com
Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2
ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx
SvrWks OSB4: IDE controller at PCI slot 0000:00:0f.1
SvrWks OSB4: chipset revision 0
SvrWks OSB4: not 100% native mode: will probe irqs later
ide0: BM-DMA at 0x1440-0x1447, BIOS settings: hda:DMA, hdb:DMA
ide1: BM-DMA at 0x1448-0x144f, BIOS settings: hdc:DMA, hdd:DMA
Probing IDE interface ide0...
hda: LG CD-ROM CRD-8522B, ATAPI CD/DVD-ROM drive
hdb: ST380021A, ATA DISK drive
ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
Probing IDE interface ide1...
hdb: max request size: 128KiB
hdb: 156301488 sectors (80026 MB) w/2048KiB Cache, CHS=65535/16/63, (U)DMA
hdb: cache flushes not supported
/dev/ide/host0/bus0/target1/lun0: p1 p2 < p5 >
mice: PS/2 mouse device common for all mice
md: md driver 0.90.1 MAX_MD_DEVS=256, MD_SB_DISKS=27
NET: Registered protocol family 2
IP: routing cache hash table of 8192 buckets, 64Kbytes
TCP established hash table entries: 262144 (order: 9, 2097152 bytes)
TCP bind hash table entries: 65536 (order: 7, 524288 bytes)
TCP: Hash tables configured (established 262144 bind 65536)
NET: Registered protocol family 1
Starting balanced_irq
BIOS EDD facility v0.16 2004-Jun-25, 2 devices found
devfs_mk_dev: could not append to parent for md/0
md: Autodetecting RAID arrays.
md: autorun ...
md: ... autorun DONE.
RAMDISK: Compressed image found at block 0
VFS: Mounted root (ext2 filesystem).
input: AT Translated Set 2 keyboard on isa0060/serio0
SCSI subsystem initialized
scsi0 : Adaptec AIC7XXX EISA/VLB/PCI SCSI HBA DRIVER, Rev 6.2.36
<Adaptec aic7899 Ultra160 SCSI adapter>
aic7899: Ultra160 Wide Channel A, SCSI Id=7, 32/253 SCBs

input: ImExPS/2 Generic Explorer Mouse on isa0060/serio1
Vendor: SEAGATE Model: ST318437LW Rev: 0105
Type: Direct-Access ANSI SCSI revision: 03
scsi0:A:0:0: Tagged Queuing enabled. Depth 253
target0:0:0: Beginning Domain Validation
WIDTH IS 1
(scsi0:A:0): 6.600MB/s transfers (16bit)
(scsi0:A:0): 160.000MB/s transfers (80.000MHz DT, offset 31, 16bit)
target0:0:0: Ending Domain Validation
scsi1 : Adaptec AIC7XXX EISA/VLB/PCI SCSI HBA DRIVER, Rev 6.2.36
<Adaptec aic7899 Ultra160 SCSI adapter>
aic7899: Ultra160 Wide Channel B, SCSI Id=7, 32/253 SCBs

SCSI device sda: 35937500 512-byte hdwr sectors (18400 MB)
SCSI device sda: drive cache: write back
SCSI device sda: 35937500 512-byte hdwr sectors (18400 MB)
SCSI device sda: drive cache: write back
/dev/scsi/host0/bus0/target0/lun0: p1 p2 < p5 >
Attached scsi disk sda at scsi0, channel 0, id 0, lun 0
kjournald starting. Commit interval 5 seconds
EXT3-fs: mounted filesystem with ordered data mode.
Freeing unused kernel memory: 296k freed
ts: Compaq touchscreen protocol output
EXT3 FS on sda1, internal journal
Adding 1831368k swap on /dev/sda5. Priority:-1 extents:1
Linux agpgart interface v0.101 (c) Dave Jones
agpgart: unable to determine aperture size.
agpgart: agp_backend_initialize() failed.
agpgart-serverworks: probe of 0000:00:00.0 failed with error -22
agpgart: unable to determine aperture size.
agpgart: agp_backend_initialize() failed.
agpgart-serverworks: probe of 0000:00:00.1 failed with error -22
kjournald starting. Commit interval 5 seconds
EXT3 FS on hdb1, internal journal
EXT3-fs: mounted filesystem with ordered data mode.
Supermount version 2.0.4 for kernel 2.6
kjournald starting. Commit interval 5 seconds
EXT3 FS on hdb5, internal journal
EXT3-fs: mounted filesystem with ordered data mode.
loop: loaded (max 8 devices)
hda: ATAPI 52X CD-ROM drive, 128kB Cache, DMA
Uniform CD-ROM driver Revision: 3.20
ip_conntrack version 2.1 (8191 buckets, 65528 max) - 260 bytes per conntrack
ip_tables: (C) 2000-2002 Netfilter core team
Floppy drive(s): fd0 is 1.44M
FDC 0 is a National Semiconductor PC87306
NET: Registered protocol family 17
eepro100.c:v1.09j-t 9/29/99 Donald Becker http://www.scyld.com/network/eepro100.html
eepro100.c: $Revision: 1.36 $ 2000/11/17 Modified by Andrey V. Savochkin <saw@saw.sw.com.sg> and others
eth0: OEM i82557/i82558 10/100 Ethernet, 00:D0:B7:B8:57:1C, IRQ 18.
Board assembly 000000-000, Physical connectors present: RJ45
Primary interface chip i82555 PHY #1.
General self-test: passed.
Serial sub-system self-test: passed.
Internal registers self-test: passed.
ROM checksum self-test: passed (0x04f4518b).
parport0: PC-style at 0x378 (0x778) [PCSPP,TRISTATE,EPP]
parport0: irq 7 detected
lp0: using parport0 (polling).
lp0: console ready
NET: Registered protocol family 10
Disabled Privacy Extensions on device c03efce0(lo)
IPv6 over IPv4 tunneling driver

Después se crea el proceso init y este comienza a ejecutar la secuencia de arranque.

Proceso init y secuencia de arranque

Cuando el núcleo ha terminado de detectar e inicializar todo el hardware y se encuentra listo para funcionar crea el primer proceso (con PID 1). El programa que corresponde a dicho proceso se encuentra en /sbin/init. Si por alguna razón no se encuentra, el núcleo ejecuta el programa /bin/sh. Si este tampoco existe el proceso de arranque se detiene.

En un arranque normal, el proceso init se encarga de ir lanzando otros procesos guiado por los ficheros de configuración. El fichero /etc/inittab define el modo en el que el sistema cambia de nivel de ejecución y el nivel de ejecución en el que la máquina debe arrancar por defecto.

En una de las máquinas del centro encontramos que /etc/inittab contiene:

#
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.
#
# Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
# Modified for RHS Linux by Marc Ewing and Donnie Barnes
#

# Default runlevel. The runlevels used by Mandrakelinux are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault:

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"


# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

# Single user mode
~~:S:wait:/bin/sh

Básicamente:

  1. Indica que el nivel de ejecución en el que se entrará al arrancar es el 5. ( id:5:initdefault: )
  2. Cuando se inicialize (al arrancar) el sistema se ejecutará: /etc/rc.d/rc.sysinit
  3. Se indica el script a ejecutar (se esperará a que termine) para pasar a un nivel de ejecución: l5:5:wait:/etc/rc.d/rc 5
  4. Se indica qué ocurrirá si:
    1. Se pulsa CTRL+ALT+SUPR
    2. El SAI nos indica que se ha cortado el suministro eléctrico
    3. El SAI nos indica que el suministro eléctrico se ha restablecido
  5. Lanza el programa /sbin/mingetty para dar la bienvenida al uusario en cada una de las tty
  6. Si estamos en modo monousuario ejecuta un shell

 

Cambio de nivel de ejecución

Al pasar a un nuevo nivel de ejecución, se llevan a cabo los siguientes pasos:

  1. Se matan todos los procesos que no están especificados en el nuevo nivel de ejecución
  2. Se lanzan todos los procesos que sí están especificados en el nuevo nivel de ejecución
  3. Los procesos que están especificados en ambos niveles se mantienen en funcionamiento


Para cada servicio existe un script que es capaz de controlarlo (marcha, paro, reinicio...). Estos scripts residen en el directorio de configuración /etc/init.d y tienen por nombre el servicio que controlan. Cada uno de ellos se puede ejecutar con distintos argumentos para realizar determinada función. Algunos argumentos comunes a la mayoría de servicios son:

ArgumentoFunción
start Inicia el servicio. Requiere que estuviese parado.
stop Detiene el servicio. Requiere que estuviese en marcha.
restart Detiene y luego vuelve a iniciar el servicio.
condrestart Reinicia el servicio si es que está en marcha.
reload El demonio vuelve a leer los ficheros de configuración
status Muestra información sobre el estado del servicio.

Directorios que configuran los niveles de ejecución

Para cada servicio existe un fichero de control localizado en /etc/init.d, pero además, por cada nivel de ejecución existe un directorio (/etc/rc[0-6].d) que contiene enlaces simbólicos a los ficheros de control de los servicios.

Estos enlaces tienen la siguiente estructura: [SK][0-9][0-9]<nombre del sevicio>

Por ejemplo, el directorio /etc/rc0.d puede contener:

lrwxrwxrwx  1 root root 18 dic 11 16:47 K05keytable -> ../init.d/keytable*
lrwxrwxrwx 1 root root 14 dic 11 16:45 K08lisa -> ../init.d/lisa*
lrwxrwxrwx 1 root root 12 dic 11 16:33 K09dm -> ../init.d/dm*
lrwxrwxrwx 1 root root 13 feb 7 10:53 K10xfs -> ../init.d/xfs*
lrwxrwxrwx 1 root root 17 dic 11 16:40 K15numlock -> ../init.d/numlock*
lrwxrwxrwx 1 root root 17 dic 11 16:47 K20kheader -> ../init.d/kheader*
lrwxrwxrwx 1 root root 17 dic 11 16:33 K20partmon -> ../init.d/partmon*
lrwxrwxrwx 1 root root 19 feb 7 11:00 K30freshclam -> ../init.d/freshclam*
lrwxrwxrwx 1 root root 20 dic 11 16:47 K44rawdevices -> ../init.d/rawdevices*
lrwxrwxrwx 1 root root 16 dic 18 20:00 K50xinetd -> ../init.d/xinetd*
lrwxrwxrwx 1 root root 15 dic 19 19:11 K56acpid -> ../init.d/acpid*
lrwxrwxrwx 1 root root 15 dic 11 16:48 K59mandi -> ../init.d/mandi*
lrwxrwxrwx 1 root root 13 dic 11 16:39 K60atd -> ../init.d/atd*
lrwxrwxrwx 1 root root 15 dic 11 16:47 K60crond -> ../init.d/crond*
lrwxrwxrwx 1 root root 19 feb 7 11:04 K60haldaemon -> ../init.d/haldaemon*
lrwxrwxrwx 1 root root 23 dic 11 16:36 K66mDNSResponder -> ../init.d/mDNSResponder*
lrwxrwxrwx 1 root root 20 dic 11 16:35 K66messagebus -> ../init.d/messagebus*
lrwxrwxrwx 1 root root 14 dic 11 16:36 K67nifd -> ../init.d/nifd*
lrwxrwxrwx 1 root root 15 dic 11 16:47 K69sound -> ../init.d/sound*
lrwxrwxrwx 1 root root 14 dic 11 16:49 K70acpi -> ../init.d/acpi*
lrwxrwxrwx 1 root root 14 dic 11 16:33 K70alsa -> ../init.d/alsa*
lrwxrwxrwx 1 root root 15 dic 11 16:47 K75netfs -> ../init.d/netfs*
lrwxrwxrwx 1 root root 17 dic 11 16:39 K86nfslock -> ../init.d/nfslock*
lrwxrwxrwx 1 root root 16 dic 11 16:47 K88syslog -> ../init.d/syslog*
lrwxrwxrwx 1 root root 17 dic 11 16:47 K89portmap -> ../init.d/portmap*
lrwxrwxrwx 1 root root 17 dic 11 16:47 K90network -> ../init.d/network*
lrwxrwxrwx 1 root root 18 dic 11 16:48 K92iptables -> ../init.d/iptables*
lrwxrwxrwx 1 root root 19 dic 19 19:13 K95harddrake -> ../init.d/harddrake*
lrwxrwxrwx 1 root root 17 dic 11 16:33 S00killall -> ../init.d/killall*
lrwxrwxrwx 1 root root 14 dic 11 16:33 S01halt -> ../init.d/halt*

Si el enlace comienza con K o con S indica si el servicio se debe terminar o lanzar al entrar en el nivel de ejecución. Recuerde que al cambiar a un nivel de ejecución primero se apagan los servicios que no deben funcionar y luego se lanzan los que deben funcionar.

El código numérico indica el órden en el que se realizará la operación (de menor a mayor), así se pueden satisfacer las dependencias entre diferentes servicios. Por ejemplo, puede no tener sentido lanzar un servidor web y luego activar la red.

En este ejemplo, al entrar en el nivel 0 (máquina apagada) se detienen todos los servicios (comenzando por keytable y terminando por harddrake). Después se lanzan dos servicios, primero killall (que termina cualquier proceso que pudiese quedar) y luego halt que detiene la máquina.

Para configurar qué servicio debe estar activo en qué nivel de ejecución se puede utilizar el comando chkconfig o bien las herramientas de administración propias de la distribución (update-rc.d en Debian y derivados en la línea de comandos o bum como editor gráfico).

 

Para saber más: