1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
|
<!--
The FreeBSD Documentation Project
The FreeBSD Spanish Documentation Project
%SOURCE% en_US.ISO8859-1/books/handbook/kernelopts/chapter.sgml
%SRCID% 0.0
$FreeBSD$
$FreeBSDes: doc/es_ES.ISO8859-1/books/handbook/kernelopts/chapter.sgml,v 1.2 2004/10/08 22:14:26 jesusr Exp $
-->
<chapter id="kernelopts">
<chapterinfo>
<authorgroup>
<author>
<firstname>Jörg</firstname>
<surname>Wunsch</surname>
<contrib>Contribuido por </contrib>
</author>
</authorgroup>
</chapterinfo>
<title>Añadiendo Opciones a la Configuración de un Nuevo Kernel</title>
<note>
<para>Es importante que antes de leer este documento, usted este
familiarizado con la sección de <link
linkend="kernelconfig">configuració del kernel</link>.</para>
</note>
<sect1>
<title>¿Qué son las <emphasis>Opciones del Kernel</emphasis>?</title>
<para>Básicamente el uso de las opciones del kernel se
encuentran descritas en la sección de <link
linkend="kernelconfig-options">configuración del kernel</link>.
También existe una explicación de opciones
<quote>históricas</quote> y de <quote>nuevo-estilo</quote>. La
meta final es que eventualmente todas las opciones soportadas por el
kernel sean del nuevo-estilo, de tal forma que para las personas que
acertadamente ejecutan <command>make depend</command> en el directorio
de compilación de su kernel, después de ejecutar
&man.config.8;, el proceso de compilación detectará
automáticamente las opciones modificadas, y sólo
recompilará los ficheros donde sea necesario. Eliminando el
anterior directorio de compilación en cada ocasión que
se ejecute &man.config.8; como es llevado a cabo ahora.</para>
<para>Básicamente, una opción del kernel no es otra cosa
que la definición de un macro del preprocesador C para el
proceso de compilación del kernel. Para efecto de hacer que la
compilación sea realmente opcional, la parte que corresponde a
la fuente del kernel (o bien el fichero kernel<filename>.h</filename>),
debe ser escrita teniendo en mente, el uso de
las opciones del kernel, por ejemplo, las opciones por omisión
pueden modificarse con la opción config. Esto normalmente se
lleva a cabo con algo como esto:</para>
<programlisting>#ifndef ESTA_OPCION
#define ESTA_OPCION (algun_valor_por_default)
#endif /* ESTA_OPCION */</programlisting>
<para>De esta forma cuando un administrador indica otro valor en su
fichero de configuración, deja sin efecto el valor que se
tiene originalmente por default, y lo substituye con este nuevo
valor. Claramente el nuevo valor será utilizado como
substituto en el código fuente, cuando el preprocesador se
ejecute, por lo que debe de tratarse de una expresión
válida para el lenguaje C, sin importar el contexto en el que
se haya estado usando el valor por default.</para>
<para>También es posible crear opciones de menor valor, que
simplemente habilitan o deshabilitan una parte particular del
código, al encerrarlo en él</para>
<programlisting>#ifdef ESTA_OPCION
[su código aqui]
#endif</programlisting>
<para>Simplemente al incluir <literal>ESTA_OPCION</literal> en su
fichero de configuración (con o sin valor alguno), activará
la parte del código que haya ingresado.</para>
<para>Para la gente que este familiarizada con el lenguaje C, inmediatamente
podrá darse cuenta de que todo pudiera ser tratado como una
<quote>opción de configuración</quote>, donde cuando menos
se tiene una simple referencia del tipo <literal>#ifdef</literal>...
Por otro lado, es poco probable que alguien especifique</para>
<programlisting>options aunno,nodefinida</programlisting>
<para>en su fichero de configuración, y que posteriormente
se pregunten por que fallo la compilación del kernel.</para>
<para>Es claro que, el uso de nombres arbitrarios para las opciones,
hacen muy difícil el poder rastrear su uso en el código
del kernel. Lo anterior es el razonamiento detrás del esquema
de opciones de <emphasis>nuevo-estilo</emphasis>, donde cada opción
se localiza en un fichero <filename>.h</filename> diferente dentro del
directorio de compilación del kernel, los cuales por
convicción son llamados
<filename>opt_<replaceable>foo</replaceable>.h</filename>. De esta
manera se pueden crear las dependencias dispuestas por Makefile, y el
comando <command>make</command> puede determinar que debe ser
recompilado, cuando una opción ha cambiado.</para>
<para>Aun con esto los mecanismos del estilo-viejo, tienen una ventaja
para las opciones locales o quizás para las opciones de
experimentación, que cuentan con un periodo de vida corto:
en virtud de que es fácil añadir un nuevo
<literal>#ifdef</literal> al código fuente del kernel, lo cual
ya lo ha hecho una opción de configuración del kernel. En
este caso, al utilizar esta opción, el administrador, es
responsable por completo, al tener conocimiento de las implicaciones
que tiene usarla (y probablemente el forzar la recompilación de
ciertas partes del kernel). Una vez que la transición de
todas las opciones soportadas por el kernel ha finalizado, &man.config.8;
advertirá cuando una opción no soportada aparezca en el
fichero de configuración, y no procederá a incluirlo
en el fichero Makefile del kernel.</para>
</sect1>
<sect1>
<title>Ahora, ¿Qué Debo Hacer?</title>
<para>Lo primero es, editar el fichero <filename>sys/conf/options</filename>
(o bien <filename>sys/<replaceable><arch></replaceable>/conf/options.
<replaceable><arch></replaceable></filename>, por ejemplo;
<filename>/sys/i386/conf/options.i386</filename>), y seleccionar un
fichero <filename>opt_<replaceable>foo</replaceable>.h</filename> que
mejor describa la nueva opción, para su inclusión.</para>
<para>Si ya existiese alguno, que se acerce al propósito de la
nueva opción, debe elegir ese. Por ejemplo, opciones que
modifiquen el comportamiento global del subsistema SCSI, pueden
incluirse en <filename>opt_scsi.h</filename>. Por default, con el simple
hecho de mencionar una opción en el fichero apropiado, digamos
<literal>FOO</literal>, implica que el valor correspondiente a esta
opción se localiza en el fichero correspondiente
<filename>opt_foo.h</filename>. Por otro lado, esto puede modificarse
al especificar el nombre de otro fichero.</para>
<para>Si el fichero
<filename>opt_<replaceable>foo</replaceable>.h</filename> para la
nueva opción no existiera, invente un nuevo nombre. Creelo de
manera que sea intuitivo, con significado, y comente la nueva
sección en el fichero
<filename>options[<replaceable>.<arch></replaceable>]</filename>.
En la ejecución de &man.config.8;, este automágicamente
reconocerá los cambios, y creará ese fichero, la
próxima vez que se ejecute. La mayoría de las opciones
deberán incluirse como encabezados por si mismos..</para>
<para>El hecho de incluir muchas opciones, dentro de un solo fichero
<filename>opt_<replaceable>foo</replaceable>.h</filename>,
tendrá como resultado la creación de un buen numero de
ficheros del kernel, durante la compilación, cuando sólo
se haya realizado un cambio en alguna de las opciones del fichero de
configuración del kernel, por esta
razón es conveniente conservar cada opción en su
propio fichero <filename>opt_</filename>.</para>
<para>Finalmente, averigue las dependencias que existen para la
nueva opción. A menos que la nueva opción sea de
nueva creación, y no exista en ninguna parte, la siguiente
alternativa es su amiga, para efecto de encontrar dependencias:</para>
<screen>&prompt.user;
<userinput>find /usr/src/sys -type f | xargs fgrep NUEVA_OPCION</userinput>
</screen>
<para>El comando anterior dará como resultado un listado de
ficheros que tienen dependecia, dirijase a todos esos ficheros y
añada lo siguiente, en la parte <emphasis>superior</emphasis>
(como encabezado), antes de todo lo que se refiere a
<literal>#include <xxx.h></literal>.</para>
<programlisting>#include "opt_foo.h"</programlisting>
<para>El seguir este orden es de suma importancia, en virtud de que las
opciones pueden modificar el comportamiento, por omisión, de los
ficheros normales del tipo <quote>#include</quote>
(N de T: librerís de encabezado), si
estos son del tipo:</para>
<programlisting> #ifndef NUEVA_OPCION #define NUEVA_OPCION (algo)
#endif</programlisting>
<para>El añadir una opción que substituye algún
encabezado, en ficheros del sistema (por ejemplo; un fichero que se
localiza en <filename>/usr/include/sys/</filename>) da como resultado
casi siempre un error. El fichero <filename>opt_<replaceable>foo
</replaceable>.h</filename> no puede ser incluido en esos ficheros,
en virtud de que generaran un conflicto más serio, con sus
propios encabezados, pero si no son incluidos, al momento de que se
deseen utilizar, se puede obtener un valor inconsistente para esta
opción. Si, existen antecedentes de esto en este momento,
pero eso no lo hace más correcto.</para>
</sect1>
</chapter>
<!--
Local Variables:
mode: sgml
sgml-declaration: "../chapter.decl"
sgml-indent-data: t
sgml-omittag: nil
sgml-always-quote-attributes: t
sgml-parent-document: ("../book.sgml" "part" "chapter")
End:
-->
|