Sistemas Operativos III
Unidad 07 El kernel de Linux Redes y Comunicaciones de Datos
Copyri Copyright ght © 2007 2007 por por TECSU TECSUP P
Kernel en Linux
1
Sistemas Operativos III
Introducción
Del núcleo o kernel de un Sistema Operativo depende la administración de los recursos de hardware (procesadores, memoria RAM, discos, periféricos), es por eso que el rendimiento de un sistema operativo depende que tan bien compilado este su kernel. En Linux tenemos la opción de compilarlo nosotros mismos agregándole o quitándole soporte para diversos dispositivos de hardware. En esta unidad veremos cómo compilar el Kernel de Linux y qué utilidades necesitamos necesitamos para para hacerlo.
2
Kernel en Linux
2
Sistemas Operativos III
Objetivos
Identificar los componentes del kernel de Linux. Diferenciar los tipos de Kernel. Identificar y utilizar los módulos del kernel. Utilizar las herramientas necesarias para compilar el Kernel y sus módulos. Administrar los módulos del Kernel.
3
Kernel en Linux
3
Sistemas Operativos III
Contenido
El Kernel de Linux. Módulos del Kernel. Compilación del Kernel. Administrando módulos.
4
Kernel en Linux
4
Sistemas Operativos III
El Kernel de Linux
El Kernel o núcleo es la parte esencial de un sistema operativo. Se encarga de la administración de la memoria, los procesos y los discos. Es independiente de la distribución GNU/Linux utilizada.
www.kernel.org www.kernel.org TCP/IP kernel
5
Originalmente Linux era solamente el nombre del núcleo. El término "núcleo" propiamente dicho se refiere al software de sistema de bajo nivel que provee una capa de abstracción sobre el hardware, control de discos y sistema de archivos, multitarea, balance de carga, comunicación en red y medidas de seguridad. Un núcleo no es un Sistema Operativo completo (tal y como se entiende el término normalmente). Las funciones más importantes del kernel son: •Administración de la memoria para todos los programas y procesos en ejecución. •Administración del tiempo de procesador que los programas y procesos en ejecución utilizan. •Es el encargado de que podamos acceder a los periféricos/elementos de nuestro ordenador de una manera cómoda
Kernel en Linux
5
Sistemas Operativos III
El Kernel de Linux: Arquitectura
Los controladore controladores s de dispositiv dispositivos os y las extensiones extensiones del núcleo normalmente se ejecutan en un espacio privilegiado conoci conocido do como como anil anillo lo 0 (ring 0 ), ), con acceso irrestricto al hardware, aunque algunos se ejecutan en espacio de usuario. Los controladores de dispositivos y las extensiones al sistema operativo se pueden cargar y descargar fácilmente como módulos, mientras el sistema continúa funcionando sin interrupciones. Los controladores pueden ser pre-volcados (detenidos momentáneamente por actividades más importantes) bajo ciertas condiciones. Esta habilidad fue agregada para mejorar el soporte de Multiprocesamiento Simétrico. 6
Aún cuando cuando Linus Linus Torvalds no ideó ideó originalmente originalmente Linux como un sistema sistema portable, es ahora de hecho, uno de los núcleos de sistema operativo más ampliamente portados, y funciona en sistemas muy diversos que van desde iPAQ (una handhel handheld) d) hasta un un zSeries (un mainframe mainframe masivo, muy costoso). De todos modos, es importante notar que los esfuerzos de Torvalds también estaban dirigidos a un tipo diferente de portabilidad. Según su punto de vista, la portabilidad es la habilidad de compilar fácilmente en un sistema aplicaciones de los orígenes más diversos; así, la popularidad original de Linux se debió en parte al poco esfuerzo esfuerzo necesario para para tener funcionando funcionando las aplicaciones favoritas de todos.
VERSIONES DE KERNEL series por debajo de la 2.6 : Las versiones del núcleo se numeran con 3 números, de la siguiente forma: A.B.C A: Indica la serie/versión principal del núcleo. Este número cambiaba cuando la manera de funcionamiento del kernel sufre un cambio muy importante. B : Indica si la versión versión es de desarrollo ó de producción. Un número impar, significa que es de desarrollo, uno par, que es de producción. C : Indica nuevas revisiones dentro de una versión, en las que lo único que se ha modificado eran fallos de programación.
Kernel en Linux
6
Sistemas Operativos III
La versión del Kernel
2.6.18.2 La versión del Kernel
Revisión mayor del Kernel
Revisión menor del Kernel
Fallos de programación y seguridad del Kernel
7
A partir partir de la serie serie 2.6 del núcleo, núcleo, el sistema sistema de de numeración numeración así como el modelo de desarrollo han cambiado. Las versiones han pasado a numerarse con 4 dígitos y no existen versiones de producción y desarrollo. Las versiones del núcleo se numeran hoy en día con 4 dígitos, de la siguiente forma: A.B.C.D. A: Indica la serie/versión principal del núcleo. B: Indica la revisión principal del núcleo. Números pares e impares no tienen ningún significado hoy en dia. C: Indica nuevas revisiones menores del núcleo. Cambia cuando nuevas características y drivers son soportados. D: Este digito cambia cuando se corrigen fallos de programación o fallos de seguridad dentro de una revisión. Actualmente son las distribuciones las encargadas de distribuir núcleos estables a sus usuarios y estos núcleos se basan en el núcleo distribuido por Linux Torvalds y el equipo de programadores del núcleo.
Kernel en Linux
7
Sistemas Operativos III
Modularidad del Kernel
El Kernel tiene componentes que son esenciales y que forman parte integral de él. Existen componente que pueden compilarse en forma de módulos, dando flexibilidad al sistema. Los módulos permiten que los dispositivos o alguna propiedad se integren al Sistema Operativo. Los módulos no se enlazan directamente al Kernel, pudiendo ejecutar en el arranque o posteriormente, cuando se necesiten. Por ejemplo, el soporte para una cierta tarjeta de red.
KERNEL MODULOS
8
En este contexto, módulo se refiere a un controlador de un dispositivos o servicio que puede cargarse o descargarse cuando el usuario o algún dispositivo lo solicita (generalmente dinámicamente). Los módulos que se distribuyen con el kernel están ubicados en el directorio version , donde version es la versión de su kernel, con la /lib/modules/ /lib/modules/ version extensión .o organizados en directorios que indican el tipo de dispositivo o el propósito. por ejemplo: fs - siste sistema ma de de archi archivo vos s net - protocolos protocolos y hardware hardware para redes. redes. Para lograr configurar un dispositivo controlado por un módulo: •
Asegurar Asegurar que no haya haya conflic conflictos tos entre entre el dispo dispositi sitivo vo con con otros otros y eventualmente conocer la configuración que usa (algunos controladores auto detectan la configuración del dispositivo, pero no todos).
•
Encontr Encontrar ar un un mó módul dulo oq que ue pued pueda am manej anejar ar el disp disposit ositivo ivo..
•
Eventua Eventualmen lmente te pasar pasar opci opciones ones al módul módulo o de acuerd acuerdo o a la config configurac uración ión del dispositivo (IRQ o I/O)
Kernel en Linux
8
Sistemas Operativos III
Administración de Módulos
Un módulo es un archivo objeto que se puede "enlazar" y "des-enlazar" en el núcleo de Linux en tiempo de ejecución. Cada módulo se compila para una versión de núcleo concreta. Para trabajar con módulos se dispone de las siguientes utilidades del sistema: # lsmod: lsmod: Lista los módulos cargados. # modin modinfo fo –d [mo [modu dulo] lo]:: Muestra información sobre el módulo. # insmod insmod [mod [modulo ulo]: ]: Instala en el núcleo un módulo. # rmmod [mo [modul dulo]: o]: Extrae del núcleo un módulo. # modprobe modprobe [mod [modulo ulo]: ]: Automatiza/facilita la gestión de módulos. # depmo depmod d -n -n:: Determina las dependencias entre módulos.
9
lsmod Lista los módulos cargados, de cada uno presenta nombre, tamaño, cuenta de usos y lista de módulos que lo usan (es equivalente a cat /proc/modules).
rmmod módulos Descarga uno o más módulos cargados, mientras estos no estén siendo usados. Con la opción -r intenta descargar recursivamente módulos de los cuales el módulo especificado dependa. El comando rmmod -a descarga todos los módulos que no estén siendo usados.
insmod módulo [ [opciones ] Trata de cargar el módulo especificado. Pueden pasarse opciones específicas para el módulo, a continuación del nombre con la sintaxis símbolo= valor . Puede indicarse una ruta no estándar para buscar módulos estableciéndola en la variable MODPATH o en /etc/modules.con /etc/modules.conf. f. Dado que los módulos módulos se enlazan enlazan directamente directamente con el kernel, deben ser compilados para una versión precisa, con la opción -f puede evitarse el chequeo de versiones.
Kernel en Linux
9
Sistemas Operativos III
Detección de Hardware
El programa programa Kudzu detecta detecta el nuevo hardware si si es soportado soportado y configura el módulo necesario para él. El módulo también puede ser especificado manualmente modificando el archivo de configuración del módulo, /etc/modprobe.conf.. , donde se le asocia un alias: /etc/modprobe.conf alias eth0 pcnet32
10
depmod Como un módulo puede requerir otros, hay dependencias que deben respetarse al cargar y descargar módulos. depmod permite calcular tales dependencias entre varios módulos o entre todos los disponibles con la opción -a.
módulo lo opciones opciones modprobe módu Emplea la información de dependencias generada por depmod e información información de /etc/modules.conf /etc/modules.conf para cargar el módulo especificad especificado, o, cargando antes todos los módulos de los cuales dependa. Para especificar el módulo basta escribir el nombre (sin la ruta, ni la extensión .o) o uno de los alias definidos en /etc/modutils/alias.
Kernel en Linux
10
Sistemas Operativos III
Información de Hardware
LINUX LINUX((KERNEL KERNEL))
procesador procesador
memoria memoria
Dispositivos Dispositivos PCI PCI
Los archivos de información del sistema se ubican en /proc CPU “cpuinfo”, Memoria “meminfo”, Interupciones “interrupts” 11
En Linux hay un mecanismo adicional para que el núcleo y los módulos del núcleo envíen información a los procesos: el sistema de ARCHIVOS /proc. Originalmente se diseño para permitir un fácil acceso a la información sobre los procesos procesos (de aquí el nombre), nombre), ahora lo utiliza cualquier cualquier elemento elemento del núcleo que tiene algo interesante que informar como: /proc/modules /proc/modules que que tiene la la lista de de los módulos. módulos. /proc/meminfo /proc/meminfo que tiene tiene las estadísti estadísticas cas de uso uso de la la memoria.
Kernel en Linux
11
Sistemas Operativos III
Setup SISTEMA SISTEMAOPERATIVO OPERATIVO
COMPONENTES COMPONENTES TECLADO, TECLADO,MOUSE MOUSE
# setup Realiza personalización de periféricos y de algunas propiedades del Sistema (Autentificación, Seguridad, Servicios).
12
Kernel en Linux
12
Sistemas Operativos III
Actualización del Kernel
La utilidad de actualizar un Kernel permite contar con soporte para un mayor número de dispositivos de hardware, parches de seguridad y mejoras que la actualización incluya. El método tradicional consiste en descargar el código fuente desde http://www.kernel.org y configurar las opciones deseadas, compilarlo e instalarlo uno mismo. Ciertamente esto permite un mayor control sobre las características deseadas, pero puede resultar un procedimiento algo complejo. Una forma más sencilla de actualizar el Kernel para distribucione distribuciones s CentOS es utilizando utilizando yum : yum upgrade kernel yum upgrade kernel-smp (para versiones multiprocesador)
13
Es útil recompilar y/o actualizar un kernel porque trabajando con kernels nuevos generalmente se obtiene: 1. Un sistem sistema a más rápid rápido, o, establ estable e y robusto robusto.. 2. Un sistema con soporte a elementos de hardware no encontrado en kernels kernels viejos. viejos. 3. Un sistema con soporte a características especiales disponibles pero no habilitadas habilitadas en kernels kernels viejos.
Importante: Si usted no tiene experiencia compilando el kernel es recomendable que utilice un equipo donde usted pueda practicar sin temor de que su sistema eventualmente pueda dañarse. No hay ningún riesgo al compilar el kernel (salvo que se quede sin espacio), en cambio, la instalación del mismo debe de realizarse con algo de cuidado.
Kernel en Linux
13
Sistemas Operativos III
Actualización del Kernel Para determinar cuáles paquetes del kernel están instalados, ejecute el comando siguiente en el intérprete de comandos:
##rpm rpm-qa -qa||grep grepkernel kernel La salida contendrá alguno o todos todos de los siguientes paquetes, dependiendo del tipo de instalación que haya realizado (el número de la versión puede variar): kernel-2.4.20-2.47.1 kernel-2.4.20-2.47.1 kernel-debug-2.4.20-2.47.1 kernel-debug-2.4.20-2.47.1 kernel-source-2.4.20-2.47.1 kernel-source-2.4.20-2.47.1 kernel-doc-2.4.20-2.47.1 kernel-doc-2.4.20-2.47.1 kernel-pcmcia-cs-3.1.31-13 kernel-pcmcia-cs-3.1.31-13 kernel-smp-2.4.20-2.47.1 kernel-smp-2.4.20-2.47.1 14
De la anterior salida, salida, puede determinar determinar qué qué paquetes paquetes necesita descargar descargar para actualizar el kernel. El único paquete necesario para un sistema con un único procesador es el kernel. Si tiene un ordenador con más de un procesador, necesita el paquete kernel-smp kernel-smp que contiene contiene el soporte para más de un procesador. procesador. También se recomienda instalar el paquete kernel en el caso de que el kernel con varios procesadores no funcione correctamente con el sistema. Si tiene un ordenador con una memoria superior a cuatro GB, necesita el paquete paquete kernel-bigmem kernel-bigmem para que el sistema sistema pueda usar más de cuatro gigabytes gigabytes de memoria. memoria. De todas todas maneras, maneras, se recomien recomienda da instalar instalar el paquete kernel por si ocurriera algún error. El paquete kernel-bigmem existe sólo para la arquitectura i686. Si está está actualiz actualizand ando o el kerne kernell en un un ordena ordenador dor portá portátil til o está usando usando PCMCIA, el paquete kernel-pcmciakernel-pcmcia-cs cs también también es necesario. No necesita el paquete kernel-so kernel-source urce a menos que vaya a recompilar recompilar el kernel por sí mismo o vaya a desarrollarlo. El paquete kernel-doc kernel-doc contiene contiene documentación documentación sobre desarrollo desarrollo del kernel y no es necesario. Se recomienda si el sistema es usado para desarrollos del kernel. El paquete paquete kernel-util kernel-util incluye incluye utilidades utilidades que que pueden pueden ser usadas usadas para controlar el kernel o el hardware del sistema. No es necesario.
Kernel en Linux
14
Sistemas Operativos III
Actualizar vía RPMs
## rpm rpm –ivh –ivh [kernel].rpm [kernel].rpm
TCP/IP kernel
Un KERNEL en formato RPM esta preparado para distribuirse en el Sistema de Archivos y actualizar automáticamente el gestor de arranque.
15
El directorio de descarga depende de la arquitectura de la computadora. Por ejemplo en el directorio i386, se encuentra los paquetes que que pueden instalarse en maquinas con cualquier microprocesador de arquitectura 80386, 80486, 80586 y 80686: kernel-x.x.xx-xx. i386.rpm (si su equipo equipo tiene tiene microprocesado microprocesadorr 80386 y 80486) kernel-doc-x.x.xx-xx.i386.rpm kernel-source-x kernel-source-x.x.xx-xx.i .x.xx-xx.i386.rpm 386.rpm (opcional) (opcional) En el subdirectorio i586 se encuentran los paquetes optimizados optimizados para microprocesadores 80586, como AMD K5, K6, K6-II y K6-III y Pentium, Pentium Pentium MMX y Pentium Pentium Pro. Pro. En el subdirectorio i686 se encuentran los paquetes optimizados para microprocesadores 80686, como los Celeron, Pentium II y Pentium III. El paquete kernel-smp-x.x.xx-xx. xxxx.rpm, es para computadoras que utilizan múltiples microprocesadores.
Kernel en Linux
15
Sistemas Operativos III
Actualizar con los fuentes
www.kernel.org www.kernel.org Descompresi Descompresió ón Descompresión Personalizació Personalizaci ón Personalización Compilació Compilaci ón Compilación Agregar Perfil Agregar Perfil
TCP/IP kernel
16
Actualizar Actualizar el kernel kernel con con los archivos archivos fuete consiste consiste en realizar realizar una compilación del Kernel. Para esta tarea debemos seguir los siguientes pasos: 1) Obtener el kernel kernel en formato formato tar.gz. -> Por ejemplo ejemplo de www.kernel.org www.kernel.org o de la pagina de la distribución que estemos utilizando. 2) Descomprimir el kernel -> Para esto utilizamos la herramienta TAR como ya describimos en la clase anterior. 3) Personalizar el kernel -> este proceso consiste en elegir los componentes que deseamos instalar en el kernel y los módulos que usaremos luego. 4) Compilación Compilación -> Es el proceso de compilación compilación del kernel kernel y nos dará como resultado la imagen del kernel y los módulos que decidimos utilizar. 5) Agregar perfil -> Consiste en agregar una entrada al gestor de arranque (GRUB o LILO) para poder poder arrancar conel conel nuevo Kernel. Kernel. Cuando instalamos un nuevo kernel no es necesario eliminar el Kernel anterior, es recomendable dejarlo aun disponible e caso nuestra nueva version de kernel presente presente problemas al momento de arrancar, arrancar, etc.
Kernel en Linux
16
Sistemas Operativos III
make menuconfig
PERSONALIZACION [x] Integracion al Kernel
SOURCE
[M] modulable make makemenuconfig menuconfig .config .config
Personaliza las propiedades del nuevo kernel. 17
La pe personalización es la pa parte del pr proceso que puede resultar mas comp compllicad icada a ya qu que e aq aqui ui de debe bemo mos s esc escog oger er qu que e comp compil ilar arem emos os en el mism mismo o kernel y que como mudulos mudulos.. Para Para esto esto util utiliz izar arem emos os un he herr rram amie ient nta a como como me menu nuco conf nfig ig,, al al abr abrir irse se la ventana de configuració configuración n Y= se incluirá soporte soporte en el kernel para es este te ítem N= no se se incluirá incluirá en el kernel M= se incluirá incluirá en forma de de módulo módulo Incluir algo en el kernel kernel en forma modular modular significa significa que el soporte soporte se compila en el kernel pero que la parte de software para dicho ítem se compila en un "módul "módulo" o" separado que el kernel mismo se ocupará ocupará de cargar en memoria solo cuando necesite el soporte para dicho ítem. Todo lo que se compila en el kernel kernel permanece permanece en memoria siempre, las partes compiladas en forma modular solo se cargan en memoria cuando son requeridas requeridas por el sistema pudiend pudiendose ose luego "bajar" "bajar" en el momento en que que ya no se utilizan.
Kernel en Linux
17
Sistemas Operativos III
Pantalla de make menuconfig
18
Kernel en Linux
18
Sistemas Operativos III
Procedimiento de Instalación KERNEL linux linux-source linux-source COMPILACION make makebzImage bzImage make makemodules modules make modules_install make modules_install
MODULOS
A partir de las fuentes se obtiene obtiene el Kernel y los módulos. 19
La compilacion compilacion del Kernel se realiza realiza con tres pasos basicos: basicos: 1) ma make ke bzIm bzImag age: e: Esta línea compila compila el kernel de linux con las opciones opciones seleccionad seleccionadas as en el paso anterior. Esta tarea puede tardar varios minutos a varias horas dependiendo de la máquina en la cual lo estemos ejecutando. Luego si todo fue bien podremos contemplar el kernel recién generado en el archivo bzImage. Este kernel debe ser copiado al directorio /boot. 2) Make Make modules modules:: Esta línea compila los módulos que usaremos con el kernel seleccionados durante la personalización. 3) Make modules-instal modules-installl Esta línea instala los módulos /lib/modules/[ver /lib/modules/[versión sión del kernel] kernel]
Kernel en Linux
compilados
en
le
directorio:
19
Sistemas Operativos III
Ubicación de elementos del Kernel /
boot
KERNEL vmlinuz vmlinuz
usr
lib modules MODULOS
src SOURCE
Ubicación del Kernel, módulos y fuentes del Kernel. Kernel. 20
Kernel en Linux
20
Sistemas Operativos III
make bzImage make makebzlilo bzlilo SELECCIÓ SELECCIÓN ACTUAL
SOURCE
.config .config [x] propiedad
KERNEL bzImage bzImage
Genera el kernel con las propiedades seleccionadas. 21
Una vez Una vez ge gene nera rada da la imag imagen en d del el kern kernel, el, ést ésta a de debe be ser cop copia iada da al direc directo tori rio o /boot y renombra renombrada da a vmlinuz-[vers vmlinuz-[version ion del kernel] kernel] #cp -i arch/i386/boot/ arch/i386/boot/bzImage bzImage /boot/vmlinuz-2. /boot/vmlinuz-2.2.18 2.18 Tambien Tambien copiar copiar el el archiv archivo o System System.map .map al direc director torio io /boot. /boot. System. System.map map contiene información acerca de los puntos de entrada de las funciones compiladas compiladas en el kernel. kernel. El kernel kernel por sí mismo conoce conoce esta información información pero algunos programas pueden necesitarla. #cp -i System.m System.map ap /bo /boot/S ot/Syste ystem.ma m.map-2. p-2.2.18 2.18
Kernel en Linux
21
Sistemas Operativos III
make modules make makemodules modules SELECCIÓ SELECCIÓN ACTUAL
SOURCE
.config [M] propiedad
/lib/modules lib/modules
MODULOS [version version] ] [version]
Genera los módulos de las propiedades seleccionadas 22
Kernel en Linux
22
Sistemas Operativos III
make modules_install
MODULOS
make makemodules_install modules_install
/lib/modules lib/modules [version version] ] [version]
Instala los módulos generados. 23
Kernel en Linux
23
Sistemas Operativos III
mkinitrd
MODULOS
mkinitrd mkinitrd
/boot initrd[version initrd[version] ] initrd[version]
Crea una imagen initrd initrd para cargar módulos SCSI. 24
El fichero especial /dev/initrd es un dispositivo de bloques de sólo lectura. El dispositivo /dev/initrd es un disco RAM que es inicializado (es decir, cargado) por el gestor de arranque antes de cargar e iniciar el núcleo del sistema. Así, el núcleo puede utilizar el contenido del dispositivo /dev/initrd para un arranque del sistema en dos fases. En la primera fase del arranque, el núcleo pone en marcha y monta un sistema de ficheros raíz inicial a partir del contenido de /dev/initrd (o sea, el disco-RAM disco-RAM inicializado inicializado por el gestor de arranque). arranque). En la segunda segunda fase, se cargan controladores adicionales u otros módulos desde el contenido del dispositivo raíz inicial. Tras cargar los módulos adicionales, se monta un nuevo sistema de ficheros raíz (es decir, el sistema de ficheros raíz habitual) desde un dispositivo diferente.
Kernel en Linux
24
Sistemas Operativos III
Modificar Gestor de Arranque lilo.conf
Nuevo Kernel
image=/boot/vmlinuz image=/boot/vmlinuz REGISTRAR label=Upgrade label=Upgrade read-only read-only root=/dev/hda1 root=/dev/hda1 grub.conf title title Upgrade Upgrade root (hd0,0) root (hd0,0) kernel /boot/vmlinuz-xxx ro /dev/hda1 initrd /boot/initrd-xxxxx.img
Agregar Agregar ent entrada rada en selección.
lilo. lilo.conf conf o
grub.c grub.conf onf
para para su 25
Una vez que el Kernel ha sido compilado debemos decirle la gestor de arranque donde esta el nuevo kernel y como debe iniciarlo. Para esto debemos agregar una nueva entrada en el archivo grub.conf. Es importante que no elimine el kernel anterior o no retire la entrada en grub.conf, que carga su kernel antiguo. Esto como medida de seguridad en caso el nuevo kernel compilado no funcione correctamente.
Kernel en Linux
25
Sistemas Operativos III
Enlaces
Kernel RHEL: http://www.redhat.com/docs/manuals/waf/rhea-dgwaf-en-6.1/ch-kernel-tutorial.html
Kernel CentOS: http://wiki.centos.org/HowTos/Custom_Kernel
GRUB http://www.linuxjournal.com/article/4622
26
Kernel en Linux
26
Sistemas Operativos III
Preguntas 1. ¿Cuál es el directorio donde se aloja la imagen del Kernel? 2. ¿En que ruta se ubican los módulos del Kernel? 3. ¿Con que comando compilamos e kernel?
27
Kernel en Linux
27
Sistemas Operativos III
Respuestas 1. /boot. 2. /lib/modules 3. ma make ke bzim bzimag age e
28
Kernel en Linux
28