<HTML> <HEAD> <TITLE>Kernel-Como: Parchear el núcleo </TITLE> </HEAD> <BODY> <A HREF="Kernel-Como-4.html">Anterior</A> <A HREF="Kernel-Como-6.html">Siguiente</A> <A HREF="Kernel-Como.html#toc5">Indice</A> <HR> <H2><A NAME="s5">5. Parchear el núcleo </A></H2> <H2><A NAME="ss5.1">5.1 Aplicación de un parche </A></H2> <P>Las actualizaciones incrementales del núcleo se distribuyen como parches <SL>No tomar con sentido peyorativo el término ``<I>parche</I>'', no se trata de un ``<I>remiendo</I>'', o ``<I>chapuza</I>'', lo que hacemos al ``<I>parchear</I>'' es modificar directamente los <B>fuentes</B> del núcleo, incluyendo las variaciones que se hayan introducido.ver el comando <CODE>diff</CODE> y <CODE>patch</CODE> para más referencias.</SL> Por ejemplo, si tiene la versión <CODE>1.1.45</CODE> y ve que existe un parche `<CODE>patch46.gz</CODE>', con ese fichero podrá actualizarse a la <CODE>1.1.46</CODE>. Debería antes de nada guardar una copia del árbol de directorios de las fuentes del núcleo actual (haciendo `<CODE>make clean</CODE>', luego `<CODE>tar cvfz antiguas-fuentes.tar.gz linux</CODE>' desde el directorio <CODE>/usr/src</CODE>).</P> <P>Ahora, supongamos que tiene `<CODE>patch46.gz</CODE>' en <CODE>/usr/src</CODE>. Vaya a ese directorio y escriba</P> <P> <BLOCKQUOTE><CODE> <PRE> zcat patch46.gz | patch -p0 </PRE> </CODE></BLOCKQUOTE> </P> <P>(o bien <BLOCKQUOTE><CODE> <PRE> patch -p0 < patch46 </PRE> </CODE></BLOCKQUOTE> </P> <P>si ya estaba descomprimido). Verá rápida (o lentamente, depende del ordenador) una serie de mensajes que le dicen que se intentan aplicar los cambios, cuáles tienen éxito y cuáles no. Normalmente, esto irá bien y no habrá que preocuparse de tanto mensaje, aunque con la opción <CODE>-s</CODE> solo saldrán los mensajes de error.</P> <P><B>Inciso de la revisión 2.1:</B></P> <P>No es infrecuente que haya que borrar el árbol de los fuentes entero y reinstalarlos de nuevo; muchas veces, se tiene un <CODE>.tar.gz</CODE> con los fuentes más un montón de parches; para evitarse el tener que parchear uno a uno, puede invocar lo siguiente desde la línea de comandos: (asumo que tratamos de parchear p. ej. con parches a partir del <CODE>2.0.20</CODE> hasta el <CODE>2.0.27</CODE>, usamos <CODE>bash</CODE> y estamos en <CODE>/usr/src</CODE>, teclee <CODE>pwd</CODE> para cerciorarse).</P> <P> <BLOCKQUOTE><CODE> <PRE> # for i in patch-2.0.2[1234567].gz; do >zcat $i | patch -p0 >done </PRE> </CODE></BLOCKQUOTE> </P> <P>Investigue por su cuenta, verá qué potencia hay en la línea de comandos *nix... </P> <P><B>fin del inciso</B></P> <P>Para ver qué partes no se han modificado correctamente, busque los ficheros <CODE>.rej</CODE> en el directorio de las fuentes. Si se usan algunas versiones de <CODE>patch</CODE> (antiguas, sobre todo) esos ficheros tendrán extensión `<CODE>#</CODE>'. Con el comando <CODE>find</CODE> encontrará fácilmente los ficheros: </P> <P> <BLOCKQUOTE><CODE> <PRE> find . -name '*.rej' -print </PRE> </CODE></BLOCKQUOTE> </P> <P>imprime todos los ficheros <CODE>.rej</CODE> que están en el directorio actual o subdirectorios. </P> <P>Si todo ha ido bien, haga `<CODE>make clean</CODE>', `<CODE>config</CODE>' y `<CODE>dep</CODE>' como se describió en las secciones <A HREF="Kernel-Como-4.html#compilacion">compilacion</A> y <A HREF="Kernel-Como-4.html#momento">momento</A>. </P> <P>Hay algunas opciones más en el comando <CODE>patch</CODE>. Con <CODE>-s</CODE>, como hemos dicho, se suprimen todos los mensajes salvo los errores. Si guarda las fuentes del núcleo en otro lugar que no sea <CODE>/usr/src/linux</CODE>, con <CODE>patch -p1</CODE> se parchearán las cosas limpiamente. Otras opciones de interés se encuentran bien documentadas en las páginas <CODE>man</CODE>.</P> <H2><A NAME="ss5.2">5.2 Si algo va mal </A></H2> <P>El problema más común es que una ejecución de <CODE>patch</CODE> intente modificar el fichero `<CODE>config.in</CODE>' y no parezca quedar bien, porque haya hecho cambios en él de acuerdo con su máquina. Este problema sucede con versiones antiguas. Para corregirlo, busque el fichero <CODE>config.in.rej</CODE>, y vea qué tiene el parche originado. Los cambios suelen ir marcados con `<CODE>+</CODE>' o `<CODE>-</CODE>' al principio de las líneas. Edítelo, recordando si las opciones estaban puestas a <CODE>Y</CODE> o a <CODE>N</CODE>, y ejecute</P> <P> <BLOCKQUOTE><CODE> <PRE> patch -p0 < config.in.rej </PRE> </CODE></BLOCKQUOTE> </P> <P>y si no tiene fallos, puede continuar con el resto del proceso. El fichero <CODE>config.in.rej</CODE> permanecerá, aunque puede borrarlo.</P> <P>Si encuentra otros problemas, puede que haya aplicado un parche fuera de orden. Si el programa <CODE>patch</CODE> responde con</P> <P> <BLOCKQUOTE><CODE> <PRE> previously applied patch detected: Assume -R? </PRE> </CODE></BLOCKQUOTE> </P> <P>probablemente estará intentando aplicar un parche anterior a su versión actual. Si responde `<CODE>y</CODE>', intentará degradar sus fuentes, y normalmente fallará, obligándole a preparar un nuevo árbol de fuentes. </P> <P>Para anular el efecto de un parche, use `<CODE>patch -R</CODE>' con el parche original.</P> <P>Lo mejor ante un problema es reinstalar un árbol de fuentes limpio y empezar de nuevo. </P> <H2><A NAME="ss5.3">5.3 Limpieza de ficheros <CODE>.orig</CODE> </A></H2> <P>Después de algunos parches, los ficheros <CODE>.orig</CODE> empezarán a abultar mucho. Por ejemplo, si estamos ya con el núcleo 1.1.51 y empezamos con el <CODE>1.1.48</CODE>, borrar los <CODE>.orig</CODE> nos ahorrara medio megabyte. Con</P> <P> <PRE> find .-name '*.orig' -exec rm -f {} ';' </PRE> </P> <P>se automatizará esa limpieza. En versiones que usen el <CODE>#</CODE> en lugar de <CODE>.rej</CODE>, sustituya el <CODE>.orig</CODE> por un `<CODE>~</CODE>'. </P> <P>Una forma mejor de hacer esto es usar <CODE>xargs</CODE> de <I>GNU</I>: </P> <P> <PRE> find .-name '*.orig' | xargs rm </PRE> </P> <P>o el método ``más seguro pero más pesado'':</P> <P> <PRE> find . -name '*.orig' -print0 | xargs --null rm -- </PRE> </P> <H2><A NAME="ss5.4">5.4 Otros parches </A></H2> <P>Hay otros parches (los llamaremos ``no estándares'') que si se aplican, probablemente provocarán que los parches de Linus no funcionen correctamente, teniendo que retroceder, corregir las fuentes o el parche, instalar de nuevo las fuentes, o una combinación de lo anterior.</P> <P><B>inciso de la R. 2.1:</B> Existe una página con información centralizada sobre este tipo de parches en:</P> <P><CODE> <A HREF="http://www.ecsnet.com/html/linux_21_upatch.html">http://www.ecsnet.com/html/linux_21_upatch.html</A></CODE></P> <P>Este es un buen sitio para buscar si necesita soporte para algún dispositivo esotérico o implementación reciente. Tenga en cuenta, no obstante, que la mayoría serán para el kernel actual de desarrollo, aunque puedan aplicarse algunos ( eiste otra página en la misma localización citada anteriormente) en el kernel de producción. </P> <P><B>fin del inciso</B></P> <P>Por ejemplo, el autor utilizaba el parche `<CODE>noblink</CODE>' que anula el parpadeo del cursor en las consolas virtuales. Este parche se actualiza (o actualizaba) frecuentemente para los nuevos núcleos. Como ahora muchos manejadores se pueden cargar como módulos, los parches ya son menos necesarios. </P> <HR> <A HREF="Kernel-Como-4.html">Anterior</A> <A HREF="Kernel-Como-6.html">Siguiente</A> <A HREF="Kernel-Como.html#toc5">Indice</A> </BODY> </HTML>