Está en la página 1de 12

Captulo 8 Proceso de arranque en GNU/Linux

1. 2. 3. 4. Al principio toma el control la BIOS. En una segunda etapa, tomar el control el cargador de arranque. En una tercera, etapa el control pasa al propio Kernel. Ultima etapa tendremos en memoria los programas de usuario conviviendo junto con el propio sistema operativo, quienes tomarn el control del sistema.

Pri era etapa! La BIOS Al encender la PC, toma control la BIOS, que reali a una serie de operaciones !sicas de "ard#are. Una ve que el "ard#are es reconocido $ queda listo para usar, la %&'( carga en memoria el c)digo del cargador de arranque $ le pasa el control. Segunda parte! "l cargador de arranque E*isten di+erentes cargadores de arranque, G#UB, Lilo, etc. ,ormalmente el cargador de arranque se guarda en el $B# -.aster %oot /ecord0 que tiene un tama1o reducido de 212 !$tes del disco, o!liga a dividir el arranque en varias etapas. 3e este modo, la BIOS carga la primer etapa del cargador de arranque. 4, despu5s cargar el resto del cargador de arranque. 6/U% se carga $ se ejecuta en 4 etapas7 8a BIOS carga la primera etapa del cargador, que se encuentra almacenada en el $B#. 8a primera etapa carga el resto del cargador. (i la segunda etapa est en un dispositivo grande, se carga una etapa intermedia -llamada etapa 1.20, que contiene c)digo e*tra que permite leer cilindros ma$ores que 1924 o dispositivos tipo 8%A. 8a segunda etapa ejecuta el cargador $ muestra el men: de inicio de 6/U%, permitiendo seleccionar el (' que se desea arrancar. Una ve seleccionado el sistema operativo que se quiere arrancar, se carga en memoria $ se le pasa el control. ;ercera parte7 El <ernel El proceso del <ernel se reali a en dos etapas7 La etapa de carga% La etapa de e&ecuci'n% El (ernel generalmente se almacena en un arc"ivo comprimido. Este arc"ivo comprimido se carga $ se descomprime en memoria. Por otra parte, tam!i5n se cargan los drivers necesarios mediante el initrd. El initrd crea un sistema de arc"ivos temporal usado en la +ase de ejecuci)n del <ernel. Una ve que el (ernel se "a cargado en memoria $ est listo, se lleva a ca!o su ejecuci)n. 8o :ltimo que se lan a es el proceso init.

) *u+ es un proceso , Un proceso es un programa que se ejecuta en un determinado momento en el sistema. (iempre "a$ una serie de procesos que se ejecuta sin que el usuario sepa de ellos $ 5stos "acen que el (istema sea utili a!le. Contiene un conjunto de estructuras de datos del =ernel $ en una direcci)n de memoria. En la direcci)n de memoria se "a reservado espacio para el c)digo del proceso, su rea de datos, pila de proceso $ otra in+ormaci)n adicional usada por el sistema durante su ejecuci)n. -a. / tipos de procesos ! Los Procesos de usuarios 7 son aquello procesos que el usuario utili a. Los 0e onios 7 son aquellos procesos que para su +uncionamiento, no requiere de la intervenci)n del usuario $ en general se usan para programas que +uncionan constantemente como servidores de red, programas administrativos, etc.

Cuarta parte! "l proceso init ;odos los sistemas Unix, ejecutan el proceso init. El arc"ivo de con+iguraci)n de init es /etc/initta1, en el que se indica el primer script que se de!e ejecutar que es el /etc/init%d/rcS Este proceso init, es el responsa!le de la iniciali aci)n de nuevos procesos, todos los procesos del sistema, e*cepto el proceso s2apper. El proceso init es un proceso dispatc"er -despac"ador0 $ produce, entre otros, los procesos para que los usuarios puedan conectarse al sistema. En operaciones de multiusuario, el papel de init es crear un proceso por cada puerto del terminal en el cul un usuario pueda conectarse. En 6,U>8inu*, los Procesos se manejan en +orma jerrquica7 cada proceso es lan ado desde un proceso ?padre@7 dic"o proceso se le llama proceso ?"ijo@. Entonces podremos deducir que todos los procesos son "ijos del proceso padre por e*celencia7 el proceso init. A more >etc>initta! A >etc>initta!7 init-B0 con+iguration. A C&d7 initta!,v 1.D1 2992>91>22 13732721 miquels E*p C A ;"e de+ault runlevel. id727initde+ault7 A %ootEtime s$stem con+iguration>initiali ation script. A ;"is is run +irst e*cept #"en !ooting in emergenc$ -E!0 mode. si!!s.sinit!/etc/init%d/rcS A F"at to do in singleEuser mode. GG7(7#ait7>s!in>sulogin A >etc>init.d e*ecutes t"e ( and = scripts upon c"ange A o+ runlevel.

A A /unlevel 9 is "alt. A /unlevel 1 is singleEuser. A /unlevels 2E2 are multiEuser. A /unlevel H is re!oot. l9797#ait7>etc>init.d>rc 9 l1717#ait7>etc>init.d>rc 1 l2727#ait7>etc>init.d>rc 2 l3737#ait7>etc>init.d>rc 3 l4747#ait7>etc>init.d>rc 4 l2727#ait7>etc>init.d>rc 2 lH7H7#ait7>etc>init.d>rc H A ,ormall$ not reac"ed, !ut +allt"roug" in case o+ emergenc$. H7H7respa#n7>s!in>sulogin A F"at to do #"en C;/8EA8;E3E8 is pressed. ca7123427ctrlaltdel7>s!in>s"utdo#n Et1 Ea Er no# A Action on special <e$press -A8;EUpArro#0. A<!77<!request7>!in>ec"o I=e$!oard /equestEEedit >etc>initta! to let t"is #or<.I A F"at to do #"en t"e po#er +ails>returns. p+77po#er#ait7>etc>init.d>po#er+ail start pn77po#er+ailno#7>etc>init.d>po#er+ail no# po77po#ero<#ait7>etc>init.d>po#er+ail stop A >s!in>gett$ invocations +or t"e runlevels. A A ;"e IidI +ield .U(; !e t"e same as t"e last A c"aracters o+ t"e device -a+ter Itt$I0. A A Jormat7 A KidL7KrunlevelsL7KactionL7KprocessL A A ,ote t"at on most 3e!ian s$stems tt$M is used !$ t"e N Findo# ($stem, A so i+ $ou #ant to add more gett$Os go a"ead !ut s<ip tt$M i+ $ou run N. A 1723427respa#n7>s!in>gett$ 3B499 tt$1 27237respa#n7>s!in>gett$ 3B499 tt$2 37237respa#n7>s!in>gett$ 3B499 tt$3 47237respa#n7>s!in>gett$ 3B499 tt$4 27237respa#n7>s!in>gett$ 3B499 tt$2 H7237respa#n7>s!in>gett$ 3B499 tt$H A E*ample "o# to put a gett$ on a serial line -+or a terminal0 A A;97237respa#n7>s!in>gett$ E8 tt$(9 DH99 vt199 A;17237respa#n7>s!in>gett$ E8 tt$(1 DH99 vt199 A E*ample "o# to put a gett$ on a modem line. A

A;37237respa#n7>s!in>mgett$ E*9 Es 2MH99 tt$(3 El arc"ivo >etc/init%d/rcS ejecuta todos los scripts situados en /etc/rcS%d/S3, los que empie an con S $ un n:mero que es el orden, si tiene el mismo n:mero de orden lo reali a al+a!5ticamente. 3onde reali a la compro!aci)n $ montaje de los sistemas de arc"ivos, la carga de m)dulos, la iniciali aci)n de los servicios de red, con+iguraci)n del reloj, etc. A ls >etc>rc(.d
/EA3.E (9H"ostname.s" (9Bmta!.s" (13net#or<ing (12n+sEcommon (29+use (91mount<ern+s.s" (9H"#cloc<+irst.s" (9Bpvenetcommit (13pppdEdns (1Hmountn+s.s" (29lmEsensors (92udev (9Hlvm2 (9Dc"ec<+s.s" (13procps (1Mmountn+sE!ootclean.s" (29openEiscsi (93mountdevsu!+s.s" (9Mc"ec<root.s" (19i+updo#n (13udevEmta! (1B<!d (29quota (94!ootlogd (9B"#cloc<.s" (19mountall.s" (13urandom (1DconsoleEsetup (21stopE!ootlogdEsingle (92<e$!oardEsetup (9Bi+updo#nEclean (11mountallE!ootclean.s" (13*11Ecommon (29alsaEutils

(9H"dparm (14portmap

(9BmoduleEinitEtools (12mountover+lo#tmp (29!ootmisc.s"

8uego, $ por compati!ilidad, tam!i5n ejecuta todos los arc"ivos -e*cepto aquellos con un P.O en su nom!re0 situados en /etc/rc%1oot/. Este :ltimo directorio est reservado para el administrador del sistema $ su utili4aci'n 5a cado en desuso. Ni6eles de arranque Qa$ dos modos de arranque 7 S.ste 76 R Utili a init por de+ecto, de!ido a la simplicidad, ma$or n:mero de recursos $ ma$or +le*i!ilidad que el tradicional init BS0, los arc"ivos de con+iguraci)n residen en el directorio /etc/rc%d. 8a ma$orSa de las distri!uciones de 6,U>8inu*. BS0 R ;iene un init di+erente la principal di+erencia se encuentra en los niveles, el sistema %(3 contiene un arc"ivo con los demonios que se ejecutaran. (istemas operativos 7 T%(3, arc"linu*, slac<#are.

Una ve completo el proceso de arranque, el proceso init iniciar todos los servicios que "an sido con+igurados para ejecutarse en el nivel de ejecuci)n predeterminado. A ;"e de+ault runlevel. id7/7initde+ault7 3e!ian utili a los siguiente niveles de arranque 7 9 -apagar el sistema0 . 1 -modo monousuario0. 2 al 2 -modos multiusuario0. H -reiniciar el sistema0.

8o que ejecuta se encuentra en /etc/rcN%d -N es el nivel de ejecuci)n0. Como se indico anteriormente ejecuta los que empie a con S $ el orden de arranque. Uemos que el contenido de este directorio apunta a los script de init%d. 3entro de /etc/init%d/ se encuentran los script de los

demonio de nuestros servicios. A ls El >etc>rc2.d>Tm$sql lr#*r#*r#* 1 root root 12 mar 21 1973D (1Dm$sql EL ..>init.d>m$sql Como vemos en el ejemplo anterior la primera letra empie a con una S 7 8os que empie an con K -estos scripts se ejecutan con el argumento stop0. 8os que empie an con ( -estos scripts se ejecutan con el argumento start0.

3espu5s de la primer letra continua con 2 dSgitos que indica el orden de arranque, siempre son dSgitos de 89 a ::, $ luego el nom!re, si tiene una S, luego el mismo nivel de arranque, se ejecuta en orden al+a!5tico. Para ejecutar un demonio "acemos lo siguiente 7 A cd >etc>init.d A .>ss" stop ;enemos los siguiente parmetros para pasarle 7 start R ejecuta el demonio. stop R mata al proceso. status R nos muestra el estado si se esta ejecutando o no. reload R relee el arc"ivo de con+iguraci)n. restart R reali a un stop $ luego un start.

Esto lo reali a en el momento, pero cuando reiniciamos nuestra PC tomara la con+iguraci)n de nuestro nivel de arranque. Personali4ar los ni6eles de e&ecuci'n Para sa!er en que nivel de arranque estamos ejecutamos el comando runle6el. A runlevel ,2 3)nde N nos indica el nivel anterior que est!amos ejecutando $ / es el nivel corriente que estamos ejecutando. Para pasarnos en el momento de un nivel a otro sin reiniciar podemos ejecutar tanto el comando init como telinit. 'pciones 7 qo* soS 8a; Relee el archivo /etc/inittab. Cambia a single user. Nivel de ejecucin.

Cuando me paso de un nivel a otro lo que "ace es ir a dic"o nivel !ajar $ su!ir los demonios.

(i queremos que al reiniciar no se ejecute un demonio de terminado tenemos 2 opcions 7 A cd >etc>rc2.d A mv (1Dm$sql =1Dm$sql ' !ien utili ando la "erramienta updateErc 7 A updateErc.d m$sql de+ault (i queremos remover un demonio en el proceso de arranque 7 A updateErc.d E+ m$sql (i queremos que solo se ejecute en el runlevel 2 $ con orden DD 7 A updateErc.d m$sql de+ault DD 2

$ane&o de procesos
8as estructuras de datos re+eridas a los procesos contienen in+ormaci)n que permite el manejo de 5stos. Algunos de los datos que contienen son 7 mapa de espacio del proceso, estado actual, prioridad de ejecuci)n, mscara actual de la se1al del proceso $ propietario. (alvo el proceso init que tiene el PI0 9, todos los dems procesos son creados por otros procesos. <tri1utos de un proceso Algunos de los parmetros asociados a los procesos a+ectan de +orma directa a su ejecuci)n, por ejemplo, el tiempo de proceso, prioridad, +ic"eros a los que se pueden acceder, etc. PI0 =Process I0enti>icacion? R Es un n:mero que identi+ica al proceso en el sistema. (e asignan de +orma secuencial a cada nuevo proceso que se crea. PPI0 =Parent Process I0enti>ication? R Es un n:mero que se corresponde con el PI0 del proceso KpadreL. El proceso KpadreL es aquel que cre) al proceso actual, llamado proceso K"ijoL del anterior. UI0@ GI0 =User Identi>ication@ Group I0enti>ication? R Estos n:meros $a aparecieron en la unidad anterior. (on el n:mero de identi+icaci)n del usuario que cre) el proceso UI0, $ el n:mero de identi+icaci)n del grupo de usuario, GI0. ()lo el superusuario $ el usuario que cre) el proceso, llamado propietario del proceso, pueden modi+icar el estado de operaci)n de los procesos. "UI0@ "GI0 =">>ecti6e User I0enti>ication@ ">>ecti6e Group I0enti>ication? R Estos n:meros identi+ican al usuario que ejecuta el procesoV es atrves de estos n:meros $ no del UI0 $ GI0 c)mo el sistema determina para qu5 +ic"eros el proceso tiene acceso.

Prioridad R 8a prioridad de un proceso a+ecta al tiempo $ al orden de ejecuci)n de 5ste por parte del procesador. Un proceso de ma$or prioridad que otro signi+ica que en la ejecuci)n de los dos procesos el sistema asignar un perSodo de ejecuci)n ma$or para el de ma$or prioridad $, adems, lo elegir ms veces para ejecutarlo. (i no se indica nada al crear un proceso, 5ste toma la misma prioridad que la del proceso KpadreL. El propietario $ el proceso mismo pueden modi+icar la prioridad, pero siempre en sentido decrecimiento s)lo el superusuario no tiene restricciones para cam!iar la prioridad de un proceso. Control de ter inal R (on enlaces que determinan de d)nde toman la entrada $ la salida de datos $ el canal de error los procesos durante su ejecuci)n. (i no se usan redirecciones, se utili an por de+ecto la entrada $ salida estndar.

Creaci'n . e&ecuci'n de procesos Cuando un proceso quiere crear un nuevo proceso, el primer paso consiste en reali ar una copia de sS mismo mediante la llamada del sistema >or(. 8a operaci)n >or( crea una copia id5ntica del proceso padre, salvo en los siguientes casos 7 El nuevo proceso tiene un PI0 distinto $ :nico. El PPI0 del nuevo proceso es el PI0 del proceso padre. (e asume que el nuevo proceso no "a usado recursos. El nuevo proceso tiene su propia copia de los +ic"eros descriptores del proceso padre.

"stados de los procesos Un proceso tiene cinco estados de ejecuci)n 7 "&ecutandose =running #?. El proceso se est ejecutando. 0ur iendo =sleeping S?. El proceso est en espera de alg:n recurso del sistema. Interca 1iado =s2apped ?. El proceso no est en memoria. Ao 1i =Ao 1ie A?. El proceso trata de +inali ar su ejecuci)n. Parado =stopped?. El proceso no puede ser ejecutado.

Cuando un proceso se ejecuta es porque tiene los recursos del sistema necesarios $ dispone de tiempo de procesador. El sistema KduermeL un proceso en el momento que necesita recursos del sistema que no se pueden o!tener de manera inmediata. 8os procesos Kdor idosL esperan a que ocurra un determinado evento. Por ejemplo entrada de datos, una cone*i)n de la red, etc. 8os procesos Kdor idosL no consumen tiempo del procesador. 8os procesos Kinterca 1iadosL no se encuentran en la memoria principal del sistema, se vuelcan a la memoria de intercam!io. Esto sucede cuando la memoria principal no dispone de su+iciente espacio li!re $ los datos del proceso pasan continuamente de la memoria de intercam!io a la principal como consecuencia, la ejecuci)n del proceso se reali a de +orma poco e+ectiva.

Cuando un proceso est K4o 1iL no se puede volver a ejecutar, el espacio de memoria que utili a!a se "a li!erado $ s)lo mantiene algunas de las estructuras de datos que le dan entidad a los procesos. Un proceso est KparadoL cuando no se puede ejecutar. 8a di+erencia entre un proceso Kdor idoL $ otro KparadoL es que este :ltimo no puede continuar ejecutndose "asta que reci!a una se1al CONT de otro proceso. 8as siguientes situaciones llevan un proceso al estado de parada7 3esde una s"ell cs5 se pulsa Ctrl7A. A petici)n de un usuario o proceso. Cuando un proceso que se ejecuta en segundo plano trata de acceder a un terminal.

SeBales 8as se1ales se utili an para que un proceso suspenda la tarea que est reali ando $ se ocupe de otra. Cuando se envSa una se1al a un proceso, 5ste puede actuar de dos maneras7 si el proceso dispone de una rutina especS+ica para esa se1al, llamada K ane&adorL o handler, la utili a, en caso contrario, el Kernel utili a el manejador por de+ecto para esa se1al. Utili ar un manejador especS+ico para una se1al en un proceso se denomina capturar la se1al. Qa$ dos se1ales que no pueden ser ni capturadas ni ignoradas, KILL $ SCOP. 8a se1al de KILL "ace que el proceso que la reci!e sea destruido. Un proceso que reci!e la se1al de SCOP suspende su ejecuci)n "asta que reci!a una se1al CONC. ;a!la de se1ales 7 ,:mero 1 2 3 4 2 H M B : 19 11 12 13 ,om!re (&6QUP (&6&,; (&6YU&; (&6&88 (&6;/AP (&6&'; (&6%U( (&6JPE SIGKILL (&6U(/1 (&6(E6U (&6U(/2 (&6P&PE 3escripci)n Qangup. &nterrumpir. (alir. &nstrucci)n ilegal. ;ra ar. &';. Error de de %us. E*cepci)n aritm5tica. 0estruir Por de+ecto ;erminar ;erminar ;erminar ;erminar ;erminar ;erminar ;erminar ;erminar Cer inar W Capturada X (& (& (& (& (& (& (& (& NO (& (& (& (& W %loqueada X (& (& (& (& (& (& (& (& NO (& (& (& (&

Primera se1al de+inida ;erminar por el usuario. Uiolaci)n de segmentaci)n. ;erminar

(egunda se1al de+inida ;erminar por el usuario. Escri!ir en un pipe. ;erminar

14 9; 1H 1M 98 1D 29 21 22 23 24 22 2H 2M 2B 2D 39 31

(&6A8/. SIGC"#$ (&6(;=J8; (&6CQ83 SIGCONC (&6(;'P (&6(;P (&6;;&, (&6;;'U (&6U/6 (&6NCPU (&6NJ(Z

Alarma del reloj. Cer inaci'n del progra a% El estado del "ijo "a cam!iado.

;erminar Cer inar

(& SI (&

(& SI (& (& NO ,' (& (& (& (& (& (& (& (& (& (& (& (&

&gnorar

(& SI ,' (& (& (& (& (& (& (& (& (& (& (& (&

Continuar despu+s de Ignorar parar% Parar. Parada desde el teclado. 8ectura en segundo plano. Escritura en segundo plano. Condici)n urgente de soc<et. Parar Parar Parar Parar &gnorar

E*cedido el tiempo de ;erminar CPU. E*cedido el tama1o de ;erminar +ic"ero. ;erminar ;erminar &gnorar ;erminar

(&6U;A8/. Alarma de tiempo virtual. (&6P/'J (&6F&,CQ (&68'(; (&6PF/ (&6U,U(E3 Alarma. Cam!ia de ventana. /ecurso perdido.

Esta ta!la la podemos ver con el comando 7 A <ill El "n6iando seBales ()lo el propietario del proceso $ el superusuario -root0 pueden mandar se1al KILL a un proceso, por de+ecto la se1al es 9; -C"#$0. <ill [Ese1al\ P&3 Ejemplo 7 A <ill ED 294

;am!i5n tenemos el comando 7 (illall que nos permite todos los procesos por el nom!re del demonio. Ejemplo 7 A <illall apac"e2 $onitori4aci'n de los procesos 3isponemos de una serie de comandos para o!tener in+ormaci)n de los procesos que se estn ejecutando, como poder conocer su P&3, estado, propietario del proceso, etc. ;am!i5n podemos cam!iar su prioridad de ejecuci)n. A ps [Eopciones\ [P&3 ...\ 'pciones 7 l u & s 6 > a x S c e 5 r Ejemplo 7 A ps au* ] more ;am!i5n tenemos el comando 7 pstree que me muestra en +orma de ar!ol los nom!re de los procesos $ de quien cuelga. Ejemplo 7 A pstree ] more Con el comando pido> podemos o!tener el &3 de un nom!re de proceso. Ejemplo 7 A pido+ apac"e2 H212 2B2B 2B2M 1M21 Formato grande. De usuario, con nombre y hora de comienzo. Trabajos. Se al. !emoria "irtual. #n$ormacin acerca de la memoria. %rbol. &rocesos de otros usuarios. &rocesos sin terminal de control. C'u hijo y 'osible $allo de la '(gina. !uestra el nombre del comando seg)n la tarea. !uestra el entorno. No muestra la cabecera. !uestra 'rocesos activos.

'tro dos comandos interesantes para ver en tiempo real es 7 top $ 5top. En am!os nos da en +orma detallada $ en tiempo real. A top A aptEget install "top A "top ;am!i5n como se menciono en otros capStulos dijimos que podemos tener in+ormaci)n de cada proceso que se ejecuta en el +iles$stem /proc. Ejemplo 7 A pido+ apac"e2 D/9; 2B2B 2B2M 1M21 A cat >proc>D/9;>cmdline >usr>s!in>apac"e2E<start Priori4ando procesos 8a prioridad de los procesos se especi+ica mediante un valor num5rico entero en el rango de 7/8, prioridad Exi a, "asta /8, prioridad ni a. (i no se indica nada, los procesos son lan ados con una prioridad por de+ecto. Un proceso de prioridad mSnima s)lo se ejecuta si no "a$ ms procesos en el sistema en espera de ser ejecutados. Para lan ar un proceso con una prioridad especS+ica se utili a el comando 7 nice [En ajuste\ [Eajuste\ [EEadjustmentRajuste\ [proceso\ Ejemplo 7 3isminu$e su prioridad en 2. (i no se indica un valor num5rico, por de+ecto, la prioridad se decrementa en 19 unidades. El superusuario puede aumentar la prioridad de ejecuci)n de los procesos. A nice E2 apac"e2 A nice EE19 apac"e2 Para modi+icar la prioridad de un proceso que se est ejecutando, se utili a el comando renice. renice prioridad [[Ep\ P&3 ^\ [[Eg\ grupo ^\ [[Eu\ usuario ...\ [proceso\ Ejemplo7 A renice 1H Ep 29HD

Procesos en 1ac(ground Con el comando no5up $ la opci)n F podemos ejecutar procesos en segundo plano para que nos quede la terminal li!re para poder seguir utili andola. Ejemplo7 A no"up $es L>dev>null _ El no5up lo que "ace es generar un arc"ivo con la salida $ aparte me permite desconectarme de la terminal $ se queda ejecutando, el F es utili arlo en segundo plano. (i no ejecuto no5up $ solo F. A $es L>dev>null _ Ueremos que al salir de la terminal muere el proceso. Ger procesos en 1ac(ground Aquellos procesos que lance en !ac<ground los puedo ver con el comando &o1s. A jo!s [1\E Ejecutando [2\` Ejecutando no"up $es L >dev>null _ $es L >dev>null _

El que aparece con el sSm!olo de H es el ultimo proceso que se esta ejecutando. Craer los procesos Con los comandos >g -+oreground0 $ 1g -!ac<ground0 es posi!le manipular los procesos que est5n suspendidos temporalmente, $a sea porque se les envi) una se1al de suspensi)n como SCOP -/80 o porque al estarlo ejecutando se presion) ctrl7A. Entonces para reanudar su ejecuci)n en primer plano usarSamos 7 A +g 1 no"up $es L >dev>null _ (i solo ejecuto >g me trae el que tiene el sim!olo H.

También podría gustarte