202 Arranque del Sistema
202.1 Customizar SysV-init
Hay siete fases que se distinguen durante el arranque:
- Carga, configuración y ejecución del cargador de kernel
- Configuración de registro
- Descompresión de kernel
- Inicialización de kernel y memoria
- Configuración del kernel
- Habilitación de CPU restantes
- Inicia la creación del proceso
Configuración del proceso init
Si se miran los procesos en ejecución en el sistema, el proceso init se encuentra en primera posición. Tiene un PPID bastante particular (0) y es el padre de bastantes otros procesos.
➜ ps -ef | head
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 jun20 ? 00:00:12 /sbin/init
root 2 0 0 jun20 ? 00:00:00 [kthreadd]
...
SysVinit
/etc/inittab tiene contenidos muy distintos, pero su estructura es siempre la misma.
identificador:nivel:modo_acción:comando
identificador
: Cadena alfanumerica de 1 a 4 caracteresnivel
: nivel donde se realizara dicha acciónmodo_acción
: Define como se ejecutará el cuarto campoinitdefault
solo sirve para definir el nivel de ejecución por defecto del sistema.sysinit
sirve para ejecutar scripts en la inicialización del sistema, independientemente del nivel de ejecución. (campo dos vacio)wait
ejecuta el comando y espera el final de esta ejecución para pasar a las siguientes líneas del archivo inittab.respawn
ejecuta el comando del cuarto campo y deja el proceso ejecutándose en segundo plano.comando
: el mcomando que se ejecutará
Directorios de los niveles.
- Se definen niveles de ejecución y qué se hará en cada uno de ellos en el directorio
/etc/rcN.d
N
es el número de ejecución. Este directorio esta formado por difrentes archivos de dominios los cuales muchos son enlaces a/etc/init.d
que es donde se encuentran los dominios. - rc ejecuta los ficheros que hay en el directorio
/etc/rcN.d/
por orden numérico (siendo N el nivel de ejecución). Estos ficheros serán enlaces que empiezan por S o K y que apuntan a script que están en/etc/init.d/
- Si el enlace empieza por S, rc le pasará el comando start y si empieza por K le pasará stop
comandos
runlevel # indica el nivel de ejecucion actual
init o telinit # cambia de un nivel de ejecución a otro
update-rc.d # establece los script que se inician en cada nivel.
# sintaxis: update-rc.d script enable/disable level/s (derivados Debian)
update-rc.d mi-servicio enable 2
telinit
1, s, S # Entrar modo rescate
q, Q # recargar configuración del demonio /etc/inttab
u, U # reejecutar el demonio
chkconfig
--add service # crear enlaces simbolicos de /etc/rcN.d/
--del service
--list [service] # ver estado de servicios en cada runlevel
--level 45 postfix on # havilitar postfix en runlevel 4 y 5
--level 45 postfix off
Una vez que todos los scripts relacionados con el nivel de ejecución se han ejecutado, también lo hace el script /etc/rc.local
Systemd
- Se ejecuta un único programa que utilizará ficheros de configuración para cada servicio a gestionar
- utiliza unidades que pueden ser de diversos tipos: automont, devices, mount, path, service, snapshot, socket y target.
- Los services se agrupan en target, donde también podemos definir el orden de ejecución y las dependencias con otros target o services. Son los equivalentes a los runlevels en SysVinit
- Cada unidad se define en un fichero con el nombre de dicha unidad y en la extensión se indica el tipo de unidad, por ejemplo ssh.service
- Estos ficheros pueden estar en distintos directorios como:
/usr/lib/systemd/system/
,/lib/systemd/system/
o/etc/systemd/system/
unidad | descripcion |
---|---|
service | El tipo de unidad más común, para recursos activos del sistema que se pueden iniciar, interrumpir y recargar. |
socket | El tipo de unidad de socket puede ser un socket de sistema de archivos o un socket de red. Todas las unidades de socket tienen una unidad de servicio correspondiente, cargada cuando el socket recibe una solicitud. |
device | Una unidad de dispositivo está asociada con un dispositivo de hardware identificado por el núcleo. |
mount | Una unidad de montaje es una definición de punto de montaje en el sistema de archivos, similar a una entrada en /etc/fstab . |
automount | Una unidad de montaje automático también es una definición de punto de montaje en el sistema de archivos, pero se monta automáticamente. |
target | Una unidad target es una agrupación de otras unidades, administradas como una sola unidad. |
snapshot | Una unidad snapshot es un estado guardado del administrador del sistema (no disponible en todas las distribuciones de Linux). |
comandos
systemctl: gestiona la gran mayoría de aspectos en systemd
- get-default: indica el target por defecto
- start/stop/status/etc.. unit[.service]:
systemctl restart apache2
- isolate unit.target : cambia al target seleccionado
- list-units [--type=service] : lista las unidades cargadas
- enable/disable: activa o desactiva una unidad
- cat muestra el fichero de la unidad
- list-dependencies: muestra un árbol de dependencias de una unidad
# ver nivel de ejecución por defecto
systemctl get-default
# asignar nivel por defecto
systemctl set-default graphical.target
# gestion de servicios
systemctl start/stop/status/enable/disable ssh.service
# visualizar archivo de servicio
systemctl cat ssh.service
# cambiar de nivel de ejecucion
systemctl isolate rescue.target/multi-user.target/graphical.target
# listar dependencias
systemctl list-dependencies
systemctl list-dependencies ssh.service
# listar units
systemctl list-units --type=service
systemctl list-unit-files
# analizar los tiempos de arranque
systemd-analyce blame
systemd-delta # obtener una descripción general de todas las anulaciones activas,
202.2 Recuperación del sistema
Gestor de arranque Grub
El gestor de arranque es un pequeño programa que se encuentra generalmente en el MBR (Master Boot Record) y cuya función es la de provocar la carga del kernel. Para ello hay que conocer la ubicación del archivo del kernel (incluyendo su partición) y la partición que se montará en /
, la raíz del sistema de archivos.
GRUB 1
Su fichero de configuración es /boot/grub/menu.lst
o /boot/grub/grub.cfg
. Grub1 Admite BIOS pero no UEFI
GRUB numera las unidades y las particiones de forma especial.El primer disco será (hd0) y la primera partición (hd0,0), después 1 y así consecutivamente.
Opciones del menu de configuración:
default
S.O. por defecto que arrancarátimeout
segundos que espera la elección del usuario
Las entradas de cada Sistema Operativo tienen:
title título
root partición_kernel
kernel /ruta/kernel ro root=partición_raíz opciones
initrd /ruta/imagen_módulos
title Ubuntu 9.10, kernel 2.6.31-16-generic
kernel /boot/vmlinuz-2.6.31-16-generic root=UUID=52200c0b-aee8-4ae0-9492-1f488051e4a3 ro quiet splash
initrd /boot/initrd.img-2.6.31-16-generic quiet
GRUB 2
Utiliza el archivo de configuración /boot/grub/grub.cfg
este archivo no se debe modificar. El archivo grub.cfg
se genera mediante el comando update-grub o grub-mkconfig
. estos comandos se basan en scripts preinstalados en /etc/grub.d
.
Las opciones modificables por el usuario se almacenan en /etc/default/grub
Hereda la nomenclatura de GRUP, pero las particiones empiezan en 1 ( hd0,1
)
Las opciones se personalizan en /etc/default/grub
GRUB_DEFAULT=
define la entrada predeterminada siendo0
la primeraGRUB_SAVEDEFAULT=
si estrue
yGRUB_DEFAULT
essaved
, la ultima opción seleccionada será la predeterminada.GRUB_TIMEOUT=
tiemp de espera, anes del inicio automático,-1
indefinido,0
automatico,1 - N
tiempo de espera.GRUB_CMDLINE_LINUX=
opciones que se agregan a la linea de kernelGRUB_ENABLE_CRYPTODISK=
si esy
las comandos de instalación y configuración de grub buscarán particiones encriptadas.
Si se quiere añadir entradas personalizadas se deben agregar en /etc/grub.d/40_custom
, un ejemplo de entrada básico es el siguiente:
menuentry "Default OS" {
set root=(hd0,1)
linux /vmlinuz root=/dev/sda1 ro quiet splash
initrd /initrd.img
}
En el ejemplo se muestra la ruta a la partición por el nombre, es buena practica utilizar el UUID con search --set=root --fs-uuid ae71b214-0aec-48e8-80b2-090b6986b625 --no-floppy
Arranque desde consola grub
El arranque desde consola, es practicamente el mismo que en un menuentry
grub> ls
(proc) (hd0) (hd0,msdos1)
grub> set root=(hd0,msdos1)
grub> linux /vmlinuz root=/dev/sda1
grub> initrd /initrd.img
grub> boot
# otra opción indicar el archivo de configuración de grub
grub> configfile (hd0,msdos1)/boot/grub2/grub.cfg
grub rescue es muy similar al anterior. Sin embargo, deberá cargar algunos módulos GRUB 2 para que todo funcione.
grub rescue> set prefix=(hd0,msdos1)/boot/grub
grub rescue> insmod normal
grub rescue> insmod linux
grub rescue> set root=(hd0,msdos1)
grub rescue> linux /vmlinuz root=/dev/sda1
grub rescue> initrd /initrd.img
grub rescue> boot
Reinstalación de Grub
El comando grub-install
reinstala GRUB en un sistema con mucha facilidad. En cambio, este método no siempre es eficaz y funciona perfectamente en caliente.
grub-install --root-directory=dir_kernel disco_destino # Grub 1
grub-install dispositivo # Grub 2
202.3 Sistemas de arranque alternativos
Aparte de GRUB, existen otras formas de cargar un núcleo Linux. Los principales son:
- LILO: antiguo programa de Linux de carga del núcleo.
- ISOLINUX: para cargar Linux desde un CD/DVD o una llave USB.
- PXE: para cargar un nuevo sistema operativo desde un servidor de red.
LILO
LILO (LInux LOader) es el programa original de carga del núcleo Linux. Hace tiempo era el cargador por defecto de las diferentes distribuciones, antes de ser sustituido progresivamente por GRUB
La configuración de lilo se encuentra en /etc/lilo.conf
. Se encuentran opciones como disco de arranque, tiempo antes del arranque, posible contraseña, ...
Cada vez que se modifica el archivo de configuración se iene que ejecutar /sbin/lilo
que modifica el cargador real enel sector de arranque del disco.
Isolinux
ISOLINUX se utiliza para crear CD/DVD de arranque, en el formato estándar ISO9660.
Forma parte del paquete syslinux, que es un conjunto de componentes que gestionan métodos de carga del núcleo alternativos (CD/DVD, PXE, etc.).
La idea es preparar en un directorio los diferentes archivos que se han de almacenar en la imagen ISO de arranque, y a continuación generar esta imagen mediante el comando mkisofs. El archivo resultante se puede grabar en un CD/DVD.
Lo más sencillo es partir de una imagen ISO de arranque que ya exista (un CD de instalación Linux por ejemplo), montarlo en el sistema de archivos. A continuación, modificar su contenido en función de nuestras necesidades y generar la nueva imagen con el comando mkisofs.
PXE
PXE (Pre-boot eXecution Environment) es un protocolo de arranque de un sistema a través de la red. Para poder utilizarlo, la tarjeta de red tiene que ser compatible con este protocolo (la mayoría de las tarjetas modernas lo son) y que se active esta funcionalidad en la BIOS del equipo.
Este método de arranque necesita un servicio DHCP y un servicio TFTP (Trivial File Transfer Protocol) activos en la red y configurados para la descarga remota de un núcleo Linux.