Mostrando entradas con la etiqueta Kernel. Mostrar todas las entradas
Mostrando entradas con la etiqueta Kernel. Mostrar todas las entradas

lunes, 29 de septiembre de 2014

Liquorix Kernel en Debian (testing)

Por estos días Debian estuvo bastante inestable por lo menos en mi caso, lo que me obligó a hacer algunos cambios, entre esos cambios figura el cambio de kernel, el nuevo Kernel Liquorix que estoy utilizando se comporta mucho mejor que el proporcionado por debian.

Una de las formas de notar la diferencia es si se comprime un archivo de 1GB o más, la diferencia es notable, el rendimiento en general se nota mucho mejor, y no he tenido ningún problema con el driver nvidia gracias a que DKMS hace su trabajo.

Para instalarlo en Debian:

# /etc/apt/sources.list.d/liquorix.list deb http://liquorix.net/debian sid main

Podemos utilizar nuestro editor favorito o usar un gestor de archivos gráfico, y agregar la línea que se muestra.

Luego de esto actualizamos he instalamos la llave:

apt-get update apt-get install '^liquorix-([^-]+-)?keyring.?'

Para instalar x86 (i386)

apt-get install linux-headers-liquorix-686 linux-image-liquorix-686

Para instalar x86_64 (amd64)

apt-get install linux-headers-liquorix-amd64 linux-image-liquorix-amd64

Con lo anterior ya estaríamos en condición de reiniciar y utilizar el nuevo kernel.

Lo que muestra el comando uname -a

ljmarin@lm ~ $ uname -a Linux lm 3.16-3.dmz.1-liquorix-686 #1 ZEN SMP PREEMPT Thu Sep 18 01:09:30 UTC 2014 i686 GNU/Linux ljmarin@lm ~ $

Pueden leer un poco más en las siguientes direcciones:
gnulinuxvagos
debianadmin

viernes, 16 de mayo de 2014

Router TP-Link TL-WR741ND + DD-WRT

Por ahí desde hace un tiempo (por necesidad) tengo instalado un router de estos sencillos TP-Link, el modelo es TL-WR741ND(ES) Ver. 4.20.

El problema con este router desde un inicio era que se desconectaba constantemente, perdía la conexión a Internet y segundos después la recuperaba, algunas veces perdía la conexión y ahí moría, debiendo apagar y prender de nuevo el router para tener conexión.

Actualicé a la última versión oficial del firmware de TP-Link y el problema pareció apenas mejorar, pero nada, siguió dando el mismo problema de conexión, y esto tanto conectado por Wifi como por cable, pensé en meterlo por el bajante del edificio y deshacerme de el y buscarme uno mejor.

Leyendo en internet me encuentro con otra gente que tiene el mismo problema con este tipo de router, hablando de un sin fin de soluciones y configuraciones pero la realidad es que es un router sencillo de gama baja y no se puede esperar mucho de este equipo.

Dicho esto, jugar con el no es tan mala idea, en algún sitio leí sobre DD-WRT y lo bien que iba en este tipo de router y animaban a instalarlo, otros más decían que no valía la pena arriesgar este modelo de router ya que si lo arruinabas era muy difícil de recuperar, la parte del riesgo beneficio.

Y en parte coincido con esto último hasta cierto punto, pero no es mi caso ya que hasta pensé en botarlo, así que averigüé todo lo que pude sobre la instalación y me lancé, para mi sorpresa todo salió casi tal cual esperaba, y digo casi porque en ningún sitio leí que al instalar DD-WRT debías entrar por wifi si o si para configurar ya que por cable no puedes ya que queda deshabilitado por defecto.

Desde que instalé DD-WRT todo funciona muy bien, no he tenido problemas de conexión de ningún tipo, he tenido varias computadoras conectadas por cable y wifi más los celulares y no ha fallado ni ha dado ningún tipo de error, por lo menos en mi caso, y serio que esto no lo esperaba. La versión que tengo instalada actualmente es la (SVN revision 23919) que tiene la versión del kernel Linux 3.10.37.

Así que para quien tenga un router de este tipo y esté pasando por lo mismos problemas de conexión pues hay esperanza xD si están dispuestos a arriesgar y a aprender un poco bien vale la pena, no dejo procedimientos ni pasos ya que en la Wiki de DD-WRT pueden encontrar todo lo necesario para instalar, también se puede conseguir mucha información en internet acerca de la instalación y configuración de DD-WRT.

Una captura de la página de información de DD-WRT:


Para terminar debo decir que nunca me gustó estar detrás de un router (no tenía porque), pero ahora, incluso con este router sencillo con DD-WRT voy descubriendo todo lo que puedo hacer con el y ha sido una grata sorpresa, va valiendo la pena el haber trasteado con el un rato. Ya dije que se puede poner en español? si está en español.

domingo, 28 de julio de 2013

Kernel 3.10.3 & Nvidia Driver 304.88 (error; 'nv_i2c_del_adapter')

Los cambios en el kernel 3.10 rompieron la instalación del driver de nvidia que actualmente uso (304.88), no hace mucho tuve el mismo problema el cual solucioné con un parche que vi en los foros de opensuse, esta ves lo encontré en los foros de nvidia.

Lo mejor es que quien lo subió comenta que funciona en "debian testing" lo mismo que uso, además que funciona relativamente bien.

Los pasos son;

1.- Usé el siguiente parche para el driver de nvidia (nvidia-304.88_linux-3.10.patch).

Index: kernel/nv-i2c.c =================================================================== --- kernel/nv-i2c.c 2013-03-27 17:01:18.000000000 -0430 +++ kernel/nv-i2c.c 2013-07-28 18:14:06.003961174 -0430 @@ -311,8 +311,6 @@ BOOL NV_API_CALL nv_i2c_del_adapter(nv_state_t *nv, void *data) { struct i2c_adapter *pI2cAdapter = (struct i2c_adapter *)data; - int osstatus = 0; - BOOL wasReleased = FALSE; #if defined(KERNEL_2_4) if (!NV_WEAK_SYMBOL_PRESENT(i2c_add_adapter)) @@ -324,15 +322,10 @@ if (!pI2cAdapter) return FALSE; // attempt release with the OS - osstatus = i2c_del_adapter(pI2cAdapter); + i2c_del_adapter(pI2cAdapter); + os_free_mem(pI2cAdapter); - if (!osstatus) - { - os_free_mem(pI2cAdapter); - wasReleased = TRUE; - } - - return wasReleased; + return TRUE; } #else // (defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)) Index: kernel/nv-procfs.c =================================================================== --- kernel/nv-procfs.c 2013-03-27 17:01:18.000000000 -0430 +++ kernel/nv-procfs.c 2013-07-28 18:20:33.710236648 -0430 @@ -60,60 +60,41 @@ __entry; \ }) -#define NV_CREATE_PROC_FILE(name,parent,__read_proc, \ - __write_proc,__fops,__data) \ - ({ \ - struct proc_dir_entry *__entry; \ - int __mode = (S_IFREG | S_IRUGO); \ - if ((NvUPtr)(__write_proc) != 0) \ - __mode |= S_IWUSR; \ - __entry = NV_CREATE_PROC_ENTRY(name, __mode, parent); \ - if (__entry != NULL) \ - { \ - if ((NvUPtr)(__read_proc) != 0) \ - __entry->read_proc = (__read_proc); \ - if ((NvUPtr)(__write_proc) != 0) \ - { \ - __entry->write_proc = (__write_proc); \ - __entry->proc_fops = (__fops); \ - } \ - __entry->data = (__data); \ - } \ - __entry; \ - }) +#define NV_PROC_RW (S_IFREG|S_IRUGO|S_IWUSR) +#define NV_PROC_RO (S_IFREG|S_IRUGO) #define NV_CREATE_PROC_DIR(name,parent) \ ({ \ struct proc_dir_entry *__entry; \ int __mode = (S_IFDIR | S_IRUGO | S_IXUGO); \ - __entry = NV_CREATE_PROC_ENTRY(name, __mode, parent); \ + __entry = proc_mkdir_mode(name, __mode, parent); \ __entry; \ }) +#if LINUX_VERSION_CODE <= KERNEL_VERSION(3,9,255) +static inline void *PDE_DATA(const struct inode *inode) { + return PDE(inode)->data; +} +#endif + #define NV_PROC_WRITE_BUFFER_SIZE (64 * RM_PAGE_SIZE) static int -nv_procfs_read_gpu_info( - char *page, - char **start, - off_t off, - int count, - int *eof, - void *data +nv_procfs_show_gpu_info( + struct seq_file *m, + void *v ) { - nv_state_t *nv = data; + nv_state_t *nv = m->private; nv_linux_state_t *nvl = NV_GET_NVL_FROM_NV_STATE(nv); struct pci_dev *dev = nvl->dev; char *type, *fmt, tmpstr[NV_DEVICE_NAME_LENGTH]; - int len = 0, status; + int status; NvU8 *uuid; NvU32 vbios_rev1, vbios_rev2, vbios_rev3, vbios_rev4, vbios_rev5; NvU32 fpga_rev1, fpga_rev2, fpga_rev3; nv_stack_t *sp = NULL; - *eof = 1; - NV_KMEM_CACHE_ALLOC_STACK(sp); if (sp == NULL) { @@ -134,31 +115,31 @@ if (rm_get_device_name(sp, nv, dev->device, dev->subsystem_vendor, dev->subsystem_device, NV_DEVICE_NAME_LENGTH, tmpstr) != RM_OK) - { + { strcpy (tmpstr, "Unknown"); } } - len += sprintf(page+len, "Model: \t\t %s\n", tmpstr); - len += sprintf(page+len, "IRQ: \t\t %d\n", nv->interrupt_line); + seq_printf(m, "Model: \t\t %s\n", tmpstr); + seq_printf(m, "IRQ: \t\t %d\n", nv->interrupt_line); if (NV_IS_GVI_DEVICE(nv)) { status = rm_gvi_get_firmware_version(sp, nv, &fpga_rev1, &fpga_rev2, &fpga_rev3); if (status != RM_OK) - len += sprintf(page+len, "Firmware: \t ????.??.??\n"); + seq_printf(m, "Firmware: \t ????.??.??\n"); else { fmt = "Firmware: \t %x.%x.%x\n"; - len += sprintf(page+len, fmt, fpga_rev1, fpga_rev2, fpga_rev3); + seq_printf(m, fmt, fpga_rev1, fpga_rev2, fpga_rev3); } } else { if (rm_get_gpu_uuid(sp, nv, &uuid, NULL) == RM_OK) { - len += sprintf(page+len, "GPU UUID: \t %s\n", (char *)uuid); + seq_printf(m, "GPU UUID: \t %s\n", (char *)uuid); os_free_mem(uuid); } @@ -166,12 +147,12 @@ &vbios_rev3, &vbios_rev4, &vbios_rev5) != RM_OK) { - len += sprintf(page+len, "Video BIOS: \t ??.??.??.??.??\n"); + seq_printf(m, "Video BIOS: \t ??.??.??.??.??\n"); } else { fmt = "Video BIOS: \t %02x.%02x.%02x.%02x.%02x\n"; - len += sprintf(page+len, fmt, vbios_rev1, vbios_rev2, vbios_rev3, + seq_printf(m, fmt, vbios_rev1, vbios_rev2, vbios_rev3, vbios_rev4, vbios_rev5); } } @@ -182,12 +163,12 @@ type = "PCI-E"; else type = "PCI"; - len += sprintf(page+len, "Bus Type: \t %s\n", type); + seq_printf(m, "Bus Type: \t %s\n", type); - len += sprintf(page+len, "DMA Size: \t %d bits\n", + seq_printf(m, "DMA Size: \t %d bits\n", nv_count_bits(dev->dma_mask)); - len += sprintf(page+len, "DMA Mask: \t 0x%llx\n", dev->dma_mask); - len += sprintf(page+len, "Bus Location: \t %04x:%02x.%02x.%x\n", + seq_printf(m, "DMA Mask: \t 0x%llx\n", dev->dma_mask); + seq_printf(m, "Bus Location: \t %04x:%02x.%02x.%x\n", nv->domain, nv->bus, nv->slot, PCI_FUNC(dev->devfn)); #if defined(DEBUG) do @@ -195,7 +176,7 @@ int j; for (j = 0; j < NV_GPU_NUM_BARS; j++) { - len += sprintf(page+len, "BAR%u: \t\t 0x%llx (%lluMB)\n", + seq_printf(m, "BAR%u: \t\t 0x%llx (%lluMB)\n", j, nv->bars[j].address, (nv->bars[j].size >> 20)); } } while (0); @@ -203,26 +184,120 @@ NV_KMEM_CACHE_FREE_STACK(sp); - return len; + return 0; } static int -nv_procfs_read_version( - char *page, - char **start, - off_t off, - int count, - int *eof, - void *data +nv_procfs_open_gpu_info( + struct inode *inode, + struct file *file ) { - int len = 0; - *eof = 1; + return single_open(file, nv_procfs_show_gpu_info, PDE_DATA(inode)); +} - len += sprintf(page+len, "NVRM version: %s\n", pNVRM_ID); - len += sprintf(page+len, "GCC version: %s\n", NV_COMPILER); +static const struct file_operations nv_procfs_gpu_info_fops = { + .owner = THIS_MODULE, + .open = nv_procfs_open_gpu_info, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; - return len; +static int +nv_procfs_show_version( + struct seq_file *m, + void *v +) +{ + seq_printf(m, "NVRM version: %s\n", pNVRM_ID); + seq_printf(m, "GCC version: %s\n", NV_COMPILER); + + return 0; +} + +static int +nv_procfs_open_version( + struct inode *inode, + struct file *file +) +{ + return single_open(file, nv_procfs_show_version, NULL); +} + +static const struct file_operations nv_procfs_version_fops = { + .owner = THIS_MODULE, + .open = nv_procfs_open_version, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static int +nv_procfs_show_registry( + struct seq_file *m, + void *v +) +{ + nv_state_t *nv = m->private; + nv_linux_state_t *nvl = NULL; + char *registry_keys; + + if (nv != NULL) + nvl = NV_GET_NVL_FROM_NV_STATE(nv); + registry_keys = ((nvl != NULL) ? + nvl->registry_keys : nv_registry_keys); + + seq_printf(m, "Binary: \"%s\"\n", registry_keys); + + return 0; +} + +static ssize_t +nv_procfs_write_registry( + struct file *file, + const char __user *buffer, + size_t count, + loff_t *pos +) +{ + int status = 0; + nv_file_private_t *nvfp = NV_GET_FILE_PRIVATE(file); + char *proc_buffer; + unsigned long bytes_left; + + down(&nvfp->fops_sp_lock[NV_FOPS_STACK_INDEX_PROCFS]); + + bytes_left = (NV_PROC_WRITE_BUFFER_SIZE - nvfp->off - 1); + + if (count == 0) + { + status = -EINVAL; + goto done; + } + else if ((bytes_left == 0) || (count > bytes_left)) + { + status = -ENOSPC; + goto done; + } + + proc_buffer = &((char *)nvfp->data)[nvfp->off]; + + if (copy_from_user(proc_buffer, buffer, count)) + { + nv_printf(NV_DBG_ERRORS, "NVRM: failed to copy in proc data!\n"); + status = -EFAULT; + } + else + { + nvfp->proc_data = PDE_DATA(file->f_inode); + nvfp->off += count; + } + +done: + up(&nvfp->fops_sp_lock[NV_FOPS_STACK_INDEX_PROCFS]); + + return ((status < 0) ? status : count); } static struct pci_dev *nv_get_agp_device_by_class(unsigned int class) @@ -432,7 +507,7 @@ nv_stack_t *sp = NULL; if (0 == (file->f_mode & FMODE_WRITE)) - return 0; + return single_open(file, nv_procfs_show_registry, PDE_DATA(inode)); nvfp = nv_alloc_file_private(); if (nvfp == NULL) @@ -481,6 +556,9 @@ RM_STATUS rm_status; int rc = 0; + if (0 == (file->f_mode & FMODE_WRITE)) + return single_release(inode, file); + nvfp = NV_GET_FILE_PRIVATE(file); if (nvfp == NULL) return 0; @@ -545,122 +623,81 @@ return rc; } -static struct file_operations nv_procfs_registry_fops = { +static const struct file_operations nv_procfs_registry_fops = { .open = nv_procfs_open_registry, + .read = seq_read, + .llseek = seq_lseek, + .write = nv_procfs_write_registry, .release = nv_procfs_close_registry, }; static int -nv_procfs_read_params( - char *page, - char **start, - off_t off, - int count, - int *eof, - void *data +nv_procfs_show_params( + struct seq_file *m, + void *v ) { unsigned int i; - int len = 0; nv_parm_t *entry; - *eof = 1; for (i = 0; (entry = &nv_parms[i])->name != NULL; i++) - len += sprintf(page+len, "%s: %u\n", entry->name, *entry->data); + seq_printf(m, "%s: %u\n", entry->name, *entry->data); - len += sprintf(page+len, "RegistryDwords: \"%s\"\n", + seq_printf(m, "RegistryDwords: \"%s\"\n", (NVreg_RegistryDwords != NULL) ? NVreg_RegistryDwords : ""); - len += sprintf(page+len, "RmMsg: \"%s\"\n", + seq_printf(m, "RmMsg: \"%s\"\n", (NVreg_RmMsg != NULL) ? NVreg_RmMsg : ""); - return len; + return 0; } static int -nv_procfs_read_registry( - char *page, - char **start, - off_t off, - int count, - int *eof, - void *data -) +nv_procfs_open_params( + struct inode *inode, + struct file *file +) { - nv_state_t *nv = data; - nv_linux_state_t *nvl = NULL; - char *registry_keys; + return single_open(file, nv_procfs_show_params, NULL); +} - if (nv != NULL) - nvl = NV_GET_NVL_FROM_NV_STATE(nv); - registry_keys = ((nvl != NULL) ? - nvl->registry_keys : nv_registry_keys); +static const struct file_operations nv_procfs_params_fops = { + .owner = THIS_MODULE, + .open = nv_procfs_open_params, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; - *eof = 1; - return sprintf(page, "Binary: \"%s\"\n", registry_keys); -} static int -nv_procfs_write_registry( - struct file *file, - const char *buffer, - unsigned long count, - void *data +nv_procfs_show_text_file( + struct seq_file *m, + void *v ) { - int status = 0; - nv_file_private_t *nvfp = NV_GET_FILE_PRIVATE(file); - char *proc_buffer; - unsigned long bytes_left; - - down(&nvfp->fops_sp_lock[NV_FOPS_STACK_INDEX_PROCFS]); - - bytes_left = (NV_PROC_WRITE_BUFFER_SIZE - nvfp->off - 1); - - if (count == 0) - { - status = -EINVAL; - goto done; - } - else if ((bytes_left == 0) || (count > bytes_left)) - { - status = -ENOSPC; - goto done; - } - - proc_buffer = &((char *)nvfp->data)[nvfp->off]; - - if (copy_from_user(proc_buffer, buffer, count)) - { - nv_printf(NV_DBG_ERRORS, "NVRM: failed to copy in proc data!\n"); - status = -EFAULT; - } - else - { - nvfp->proc_data = data; - nvfp->off += count; - } - -done: - up(&nvfp->fops_sp_lock[NV_FOPS_STACK_INDEX_PROCFS]); + seq_printf(m, "%s", (char *)m->private); - return ((status < 0) ? status : (int)count); + return 0; } static int -nv_procfs_read_text_file( - char *page, - char **start, - off_t off, - int count, - int *eof, - void *data +nv_procfs_open_text_file( + struct inode *inode, + struct file *file ) { - *eof = 1; - return sprintf(page, "%s", (char *)data); + return single_open(file, nv_procfs_show_text_file, PDE_DATA(inode)); } +static const struct file_operations nv_procfs_text_fops = { + .owner = THIS_MODULE, + .open = nv_procfs_open_text_file, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + static void nv_procfs_add_text_file( struct proc_dir_entry *parent, @@ -668,22 +705,7 @@ const char *text ) { - NV_CREATE_PROC_FILE(filename, parent, - nv_procfs_read_text_file, NULL, NULL, (void *)text); -} - -static void nv_procfs_unregister_all(struct proc_dir_entry *entry) -{ - while (entry) - { - struct proc_dir_entry *next = entry->next; - if (entry->subdir) - nv_procfs_unregister_all(entry->subdir); - remove_proc_entry(entry->name, entry->parent); - if (entry == proc_nvidia) - break; - entry = next; - } + proc_create_data(filename, NV_PROC_RO, parent, &nv_procfs_text_fops, (void *)text); } #endif @@ -713,26 +735,11 @@ if (!proc_nvidia) goto failed; - entry = NV_CREATE_PROC_FILE("params", proc_nvidia, - nv_procfs_read_params, NULL, NULL, NULL); + entry = proc_create("params", NV_PROC_RO, proc_nvidia, &nv_procfs_params_fops); if (!entry) goto failed; - /* - * entry->proc_fops originally points to a constant - * structure, so to add more methods for the - * binary registry write path, we need to replace the - * said entry->proc_fops with a new fops structure. - * However, in preparation for this, we need to preserve - * the procfs read() and write() operations. - */ - nv_procfs_registry_fops.read = entry->proc_fops->read; - nv_procfs_registry_fops.write = entry->proc_fops->write; - - entry = NV_CREATE_PROC_FILE("registry", proc_nvidia, - nv_procfs_read_registry, - nv_procfs_write_registry, - &nv_procfs_registry_fops, NULL); + entry = proc_create("registry", NV_PROC_RW, proc_nvidia, &nv_procfs_registry_fops); if (!entry) goto failed; @@ -753,8 +760,7 @@ nv_procfs_add_text_file(proc_nvidia_patches, "README", __README_patches); - entry = NV_CREATE_PROC_FILE("version", proc_nvidia, - nv_procfs_read_version, NULL, NULL, NULL); + entry = proc_create("version", NV_PROC_RO, proc_nvidia, &nv_procfs_version_fops); if (!entry) goto failed; @@ -771,15 +777,11 @@ if (!proc_nvidia_gpu) goto failed; - entry = NV_CREATE_PROC_FILE("information", proc_nvidia_gpu, - nv_procfs_read_gpu_info, NULL, NULL, nv); + entry = proc_create_data("information", NV_PROC_RO, proc_nvidia_gpu, &nv_procfs_gpu_info_fops, nv); if (!entry) goto failed; - entry = NV_CREATE_PROC_FILE("registry", proc_nvidia_gpu, - nv_procfs_read_registry, - nv_procfs_write_registry, - &nv_procfs_registry_fops, nv); + entry = proc_create_data("registry", NV_PROC_RW, proc_nvidia_gpu, &nv_procfs_registry_fops, nv); if (!entry) goto failed; @@ -789,27 +791,13 @@ if (!proc_nvidia_agp) goto failed; - entry = NV_CREATE_PROC_FILE("status", proc_nvidia_agp, - nv_procfs_read_agp_status, NULL, NULL, nv); - if (!entry) - goto failed; - - entry = NV_CREATE_PROC_FILE("host-bridge", proc_nvidia_agp, - nv_procfs_read_agp_info, NULL, NULL, NULL); - if (!entry) - goto failed; - - entry = NV_CREATE_PROC_FILE("gpu", proc_nvidia_agp, - nv_procfs_read_agp_info, NULL, NULL, nv); - if (!entry) - goto failed; } } #endif return 0; #if defined(CONFIG_PROC_FS) failed: - nv_procfs_unregister_all(proc_nvidia); + remove_proc_subtree("nvidia", proc_nvidia); return -1; #endif } @@ -817,6 +805,6 @@ void nv_unregister_procfs(void) { #if defined(CONFIG_PROC_FS) - nv_procfs_unregister_all(proc_nvidia); + remove_proc_subtree("nvidia", proc_nvidia); #endif }

Pueden ver el parche.

2.- Aplicar el parche al driver

./NVIDIA-Linux-x86-304.88.run --apply-patch nvidia-304.88_linux-3.10.patch

Esto creará una modificación del driver que se llamará "NVIDIA-Linux-x86-304.88-custom.run", este último es el que se instalará.

En mi caso la instalación funciono sin novedad, y el vídeo funciona igual que antes, hasta ahora sin problemas.

Fuente: foros nvidia.

miércoles, 19 de junio de 2013

Cambiar el logo que vemos al inicio del kernel linux

Para los que compilan su propio kernel estarán acostumbrados a ver el pingüino del linux kernel, para cambiarlo es más fácil de lo que piensan.

* Lo primero es elegir la imagen a usar y guardarla como .png con 80x80 px.
* Revisamos si tenemos instalado "netpbm", luego usamos el siguiente comando desde la consola dentro de la carpeta donde tenemos la imagen:

$ pngtopnm debian-logo-80x80.png | ppmquant -fs 223 | pnmtoplainpnm > logo_linux_clut224.ppm

* La ubicacion del logo está en: "/usr/src/linux-3.x.x/drivers/video/logo/logo_linux_clut224.ppm"
* Reemplazamos la imagen original por la que hemos creado.
* Compilamos el kernel.

Listo, deberían ver la nueva imagen al inicio.

Más información (en ingles) en: Sumanprasanna Wordpress.

jueves, 30 de mayo de 2013

Usando make localmodconfig en Debian

Algo que he venido haciendo a través del tiempo usando linux es compilar el kernel, aquí en debian lo hacia a pie (sin crear los .deb) y usaba "make xconfig" para configurar el kernel más fácilmente.

Pero un poco antes de la versión 3 del kernel cambió el modo en que venía funcionando la compilación del kernel de esta manera (a pie).

Usando "make xconfig" deshabilitaba muchas cosas que no utilizaba en el kernel, más sin embargo todavía quedaban muchas otras que no tenía idea y las dejaba tal cual, además que xconfig se vale de las librerías de QT para funcionar, anteriormente no eran muchas las dependencias (qt3) pero ahora son muchas más (qt4) por lo que dejó también de ser una opción.

Esto me llevó a crear los paquetes .deb (que en realidad es más fácil que hacerlo a pie xD) y cambiar xconfig por gconfig que utiliza las librerías de GTK y tiene muchas menos dependencias (hasta ahora).

Con esto me animé a probar el comando "make localmodconfig" que ya lo había visto desde hace tiempo, pero nunca me había atrevido a usar.

Información sobre como funciona este comando se puede encontrar en Internet, con ejemplos y explicaciones (sobre todo en ingles), pero para comentar brevemente más o menos lo que hace es detectar que módulos tenemos cargados en el sistema y habilitarlos en el kernel (archivo .config) prácticamente todo lo demás que no sea necesario queda deshabilitado.

En el primer intento casi todo funcionaba, no podía montar el pendrive (usb) ni montar la partición de windows o montar una carpeta a través de samba, y os-prober tampoco funcionaba, tomé la previsión con la parte del usb pero obvio me falto algo, había leído que el comando deshabilitaba el soporte usb, me fije que no, lo que deshabilita es el HID por esta razón no funciona, pero yo lo activé, al igual que active el soporte para los archivos de windows vfat y ntfs, pero quedo faltando algo.

Para solucionar esto leí que había que montar un pendrive a la hora de ejecutar el comando "make localmodconfig" (tiene sentido ya que con esto se cargan los módulos necesarios) pero probé de nuevo habilitando en el kernel FUSE y de esta manera funciono el usb y podía montar la partición de windows más no montaba la carpeta a través de samba.

Así que me fui a lo seguro, desde el kernel de debian monte un pendrive, monte windows y monte samba, con esto vi las diferencias de la configuración, lo que me quedo faltando fue CIFS, que al activarlo todo funciono de nuevo.

La razón por la que comento todo lo anterior es que al correr el comando pueden quedar muchas cosas sin funcionar, como ven hay que cargar los módulos para que estos queden activos, entonces hay que estar pendiente de que estos módulos que comenté estén activados en el kernel, así como cualquier otro modulo que se necesite.

Sin más todo quedaría así:

1.- make localmodconfig

2.- make gconfig

3.- make-kpkg clean && make-kpkg --initrd kernel_image kernel_headers

En el paso 1 corremos el comando con lo que necesitemos ya montado, pendrive, samba etc.

En el paso 2 hacemos los ajustes que deseemos y activamos los que nos pueda quedar faltando, como el soporte vfat y ntfs.

En el paso 3 creamos los paquetes .deb.

Bueno ya con esto deberíamos de tener un kernel solo con lo que necesitamos :)

lunes, 7 de enero de 2013

Kernel 3.7.1 y Nvidia Driver (version.h does not exist)

Hace poco al querer instalar el driver 304.64 de Nvidia en el kernel 3.7.1 este me daba un error parecido al siguiente:

ERROR: The kernel header file '/usr/src/linux-headers-3.7.1/include/linux/version.h' does not exist. The most likely reason for this is that the kernel source files in '/usr/linux-headers-3.7-1' have not been configured.

Solucionar el problema fue sencillo, los pasos fueron los siguientes;

1.- Usé el siguiente parche para el driver de Nvidia.

Index: kernel/conftest.sh =================================================================== --- kernel/conftest.sh.orig +++ kernel/conftest.sh @@ -20,6 +20,7 @@ ARCH=$3 ISYSTEM=`$CC -print-file-name=include 2> /dev/null` SOURCES=$4 HEADERS=$SOURCES/include +HEADERSA=$SOURCES/include/uapi OUTPUT=$5 XEN_PRESENT=1 @@ -118,7 +119,7 @@ build_cflags() { fi fi - CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS" + CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS -I$HEADERSA $AUTOCONF_CFLAGS" test_xen @@ -146,10 +147,10 @@ build_cflags() { fi fi - CFLAGS="$BASE_CFLAGS $MACH_CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS" + CFLAGS="$BASE_CFLAGS $MACH_CFLAGS $OUTPUT_CFLAGS -I$HEADERS -I$HEADERSA $AUTOCONF_CFLAGS" if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]; then - CFLAGS="$CFLAGS -I$SOURCES/arch/x86/include -I$OUTPUT/arch/x86/include/generated" + CFLAGS="$CFLAGS -I$SOURCES/arch/x86/include -I$SOURCES/arch/x86/include/uapi -I$OUTPUT/arch/x86/include/generated -I$OUTPUT/arch/x86/include/generated/uapi" elif [ "$ARCH" = "arm" ]; then CFLAGS="$CFLAGS -I$SOURCES/arch/arm/include -I$OUTPUT/arch/arm/include/generated" fi Index: kernel/nv-mmap.c =================================================================== --- kernel/nv-mmap.c.orig +++ kernel/nv-mmap.c @@ -14,6 +14,11 @@ #include "os-interface.h" #include "nv-linux.h" +/* Fix needed for change in VM_xxx flags */ +#ifndef VM_RESERVED +# define VM_RESERVED (VM_DONTEXPAND | VM_DONTDUMP) +#endif + /* * The 'struct vm_operations' open() callback is called by the Linux * kernel when the parent VMA is split or copied, close() when the

Descarga: Parche

2.- Aplicar el parche al driver

./NVIDIA-Linux-x86-304.64.run --apply-patch patch_nvidia_304_60.run_for_3.7.1

Esto creará una modificación del driver que se llamará "NVIDIA-Linux-x86-304.64-custom.run", este último es el que se instalará.

3.- Luego de compilar el kernel 3.7.1 se crea un enlace simbólico.

ln -s /usr/src/linux-3.7.1/include/generated/uapi/linux/version.h /usr/src/linux-3.7.1/include/linux/version.h

Para esto se deben conservar las fuentes del kernel.

En teoría ya pueden instalar el driver modificado en el kernel 3.7.1, en mi caso funcionó sin ningún problema.

Fuente: Foro de opensuse.

sábado, 15 de enero de 2011

Debian Kernel 2.6.37-ck (Con Kolivas Patch)

En este kernel he probado con la opción "LZO" para que el kernel se descomprima más rápidamente, o por lo menos eso dicen :D

Si tienen algún problema pueden instalar el paquete "lzop".

# apt-get install lzop


* Adicionalmente he creado una sección "Descargas" en la parte derecha de la página donde estaré colocando algunos paquetes para descargar.

lunes, 20 de diciembre de 2010

Patch Con Kolivas en Debian - Parte 2

Como había comentado un tiempo atrás, les hablare brevemente como compilar el kernel usando uno de los parches de Con Kolivas, la ves anterior utilice el parche bfs, esta ves utilizare el parche ck que también posee lo contenido dentro del parche bfs pero con algunas modificaciones más.

Si ya tienen todo lo necesario para compilar el kernel....

Los pasos que he seguido son:

* Descargar el kernel linux-2.6.36
--> Kernel-2.6.36

* Descargar el parche-2.6.36-ck2
--> Patch-2.6.36-ck2

* Descargar la actualización del parche-2.6.36-ck2
--> Patch-2.6.36-ck2-bfs-360

* Una ves descargados los copiamos a /usr/src

* Descomprimimos el kernel y los parches

* Renombramos la carpeta del kernel a linux-2.6.36-ck

* Entramos a la nueva carpeta y copiamos dentro nuestra configuración del kernel actual (.config)

* Dentro de la carpeta linux-2.6.36-ck abrimos un terminal y aplicamos los parches
  1. # patch -p1 < /usr/src/patch-2.6.36-ck2
  2. # patch -p1 < /usr/src/2.6.36-ck2-bfs-360.patch
* Ya solo queda configurar el kernel (si es que se va a hacer) y compilarlo

* Modo de compilación 1 (Debian) crea los paquetes .deb
  1. # make xconfig
  2. # make-kpkg clean && make-kpkg --initrd kernel_image kernel_headers
* Modo de compilación 2 (instala los archivos directo al disco)
  1. # make xconfig
  2. # make xconfigmake && make modules_install && make install
  3. # mkinitramfs -o /boot/initrd.img-2.6.36-ck2 2.6.36-ck2
* Si todo va bien deberíamos tener un kernel compilado.


Para los que no quieren pasar por el trabajo les dejo el que he compilado usando la configuración del kernel actual en debian testing.

Actualizado 15/01/2011

* Ahora pueden encontrarlo en el lado derecho de la página en "Descargas"

* Para instalar
--> # dpkg -i *.deb

viernes, 1 de octubre de 2010

Usando Patch Con Kolivas en Debian

Ya tengo algún tiempo trasteando con los parches de Con Kolivas, me han dado buenos resultados tanto en el Desktop como en la laptop, pero sobre todo en la laptop.

Kolivas tiene dos parches que he visto y usado, el "ck" y el "bfs", en un inicio probé el ck y luego el bfs en la laptop, pero ya que el bfs lo puedo usar en el último kernel estable hasta el día de hoy "2.6.35.7" estoy usando este último.

La diferencia se nota más que todo en la laptop, en el tiempo que le toma ejecutar programas o realizar tareas que exigen el procesador, al kernel le he quitado muchos drivers y cosas que no utilizo, aunque la diferencia la hace el parche.

Cuando salga la versión 2.6.36 del kernel tratare de explicar como compilar el kernel usando estos parches de kolivas.

Para los que quieran probar en Debian sin tener que compilar nada les dejo la opción de bajar los paquetes .deb listos para instalar.

La imagen tiene la configuración del kernel "2.6.32-5-686" con algunos cambios;

Preemption Model:
Preemptible Kernel (Low-Latency Desktop) (PREEMPT)

Timer frequency:
1000 HZ (HZ_1000)

Eliminado
ATA/ATAPI/MFM/RLL support (DEPRECATED) (IDE)

Activado
Bootup logo (LOGO)

Y por supuesto el parche "BFS"

Todo lo demás a quedado igual al .config de debian

Para descargarlos;

Actualizado 20/12/2010

Pueden bajar el nuevo kernel con el patch desde:
--> Ir a la página