Linux OpenWrt en Mikrotik Routerboard 433
gerardo publicó esto el 26/08/09 en Sistemas Operativos. Un comentarioRouterBoard es una plataforma de hardware fabircada por Mikrotik, los productos RouterBoard en general vienen equipados con el sistema operativo RouterOS y existen modelos muy variados adaptados para cada situación particular. En este caso puntual tenemos un modelo RB433uah bastante nuevo con características que lo hacen interesantes para un uso bastante variado.
Tratándose de hardware no convencional y con características un tanto particulares donde la instalación no se hace de la manera que conocemos habitualmente llevada a cabo en una Pc, lo cual no significa que no haya una distribución de Linux que pueda correr en dicho hardware, al contrario, muchos modelos comerciales, no esta marca, ya lo traen instalado y soportado oficialmente. En este caso instalamos la distribución Openwrt especialmente preparada para routers y trae entre sus profiles la posibilidad de elegir compilaciones para arquitectura Mips, que es nuestro caso.
Habiendo documentación suficiente acerca de los pormenores de la instalación de Openwrt, a propósito bastante atípica por su oprientación específica hacia routers y hardware embedded, vamos a fijarnos sólo en lo que a las particularidades que la placa Mikrotik Rb433uah nos presenta y no será suficiente para realizar una instalación sin experiencia previa. No obstante puede tomarse la guía del link mencionado mas adelante, por ejemplo, para complementar y adaptarla a este modelo.
Tomando como punto de partida este post y esta serie de consejos y experiencias para instalar Linux OpenWrt en la placa Mikrotik RB433UAH. Aunque aparentemente similares, internamente la rb433uah está mas emparentada con el modelo RB450 que con las 433 anteriores. Y a pesar de no estar en la lista oficial de Harware soportado, aplicando una serie de parches, se puede hacer funcionar y darle una utilidad, sobre todo para aquellos que no simpatizan con RouterOs preinstalado y licenciado por defecto al comprarla.
Como se puede ver el Router RB433uah es una poderosísima placa con procesador Mips de 680Mhz con overlock hasta 800Mhz, 128Mb de RAM y almacenamiento NAND Flash de 512 Mb. Con un plus de 2 puertos USB lo cual expande enormemente sus posbilidades de uso. Además equipada claro de 3 slots minipci y 3 ethernets.
Para este momento en particular se usa el development branch de openwrt:
svn co svn://svn.openwrt.org/openwrt/packages/
actualmente con kernel 2.6.30
Como primera medida habrá que agregar el modelo a la lista de placas soportadas, lo cual nos permitirá bootear de la misma via tftpboot y reconocer el almacenamiento NAND Flash de 512Mb donde alojar permanentemente la instalación.
Primero parchar los archivos mach-rb-4xx.c, prom.c y ar71xx.h:
Index: target/linux/ar71xx/files/arch/mips/include/asm/mach-ar71xx/ar71xx.h
===================================================================
--- target/linux/ar71xx/files/arch/mips/include/asm/mach-ar71xx/ar71xx.h (revision 16741)
+++ target/linux/ar71xx/files/arch/mips/include/asm/mach-ar71xx/ar71xx.h (working copy)
@@ -124,7 +124,9 @@
AR71XX_MACH_AW_NR580, /* AzureWave AW-NR580 */
AR71XX_MACH_RB_411, /* MikroTik RouterBOARD 411/411A/411AH */
AR71XX_MACH_RB_433, /* MikroTik RouterBOARD 433/433AH */
+ AR71XX_MACH_RB_433U, /* MikroTik RouterBOARD 433/433UAH */
AR71XX_MACH_RB_450, /* MikroTik RouterBOARD 450 */
+ AR71XX_MACH_RB_450G, /* MikroTik RouterBOARD 450G */
AR71XX_MACH_RB_493, /* Mikrotik RouterBOARD 493/493AH */
AR71XX_MACH_PB42, /* Atheros PB42 */
AR71XX_MACH_PB44, /* Atheros PB44 */
Index: target/linux/ar71xx/files/arch/mips/ar71xx/prom.c
===================================================================
--- target/linux/ar71xx/files/arch/mips/ar71xx/prom.c (revision 16741)
+++ target/linux/ar71xx/files/arch/mips/ar71xx/prom.c (working copy)
@@ -39,10 +39,16 @@
.name = "433",
.mach_type = AR71XX_MACH_RB_433,
}, {
- .name = "450",
+ .name = "433U",
+ .mach_type = AR71XX_MACH_RB_433U,
+ }, {
+ .name = "450",
.mach_type = AR71XX_MACH_RB_450,
}, {
- .name = "493",
+ .+ .mach_type = AR71XX_MACH_RB_450G,
+ }, {
+ .name = "493",
.mach_type = AR71XX_MACH_RB_493,
}, {
.name = "AP81",
Index: target/linux/ar71xx/files/arch/mips/ar71xx/mach-rb-4xx.c
===================================================================
--- target/linux/ar71xx/files/arch/mips/ar71xx/mach-rb-4xx.c (revision 16741)
+++ target/linux/ar71xx/files/arch/mips/ar71xx/mach-rb-4xx.c (working copy)
@@ -72,7 +72,7 @@
}
};
-#if 0
+#if 0
/*
* SPI device support is experimental
*/
@@ -84,7 +84,8 @@
{
.bus_num = 0,
.chip_select = 0,
- .max_speed_hz = 25000000,
+ .max_speed_hz = 33000000,
+ .mode = SPI_MODE_0,
.modalias = "m25p80",
.platform_data = &rb4xx_flash_data,
}
@@ -98,13 +99,15 @@
{
.bus_num = 0,
= "450G",
.chip_select = 0,
- .max_speed_hz = 25000000,
+ .max_speed_hz = 33000000,
+ .mode = SPI_MODE_0,
.modalias = "m25p80",
- .platform_data = &rb433_flash_data,
+ .platform_data = &rb4xx_flash_data,
}, {
.bus_num = 0,
.chip_select = 2,
- .max_speed_hz = 25000000,
+ .max_speed_hz = 10000000,
+ .mode = SPI_MODE_0,
.modalias = "mmc_spi",
.platform_data = &rb433_mmc_data,
}
@@ -113,7 +116,6 @@
static u32 rb433_spi_get_ioc_base(u8 chip_select, int cs_high, int is_on)
{
u32 ret;
-
if (is_on == AR71XX_SPI_CS_INACTIVE) {
ret = SPI_IOC_CS0 | SPI_IOC_CS1;
} else {
@@ -205,7 +207,31 @@
}
MIPS_MACHINE(AR71XX_MACH_RB_433, "MikroTik RouterBOARD 433/AH", rb433_setup);
+static void __init rb433u_setup(void)
+{
+ rb4xx_generic_setup();
+ rb433_add_device_spi();
+ ar71xx_add_device_mdio(0xffffffe9);
+
+ ar71xx_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
+ ar71xx_eth0_data.phy_mask = 0x00000006;
+ ar71xx_eth0_data.speed = SPEED_100;
+ ar71xx_eth0_data.duplex = DUPLEX_FULL;
+
+ ar71xx_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_RMII;
+ ar71xx_eth1_data.phy_mask = 0x00000010;
+
+ ar71xx_add_device_eth(1);
+ ar71xx_add_device_eth(0);
+
+ ar71xx_add_device_usb();
+
+ ar71xx_pci_init(ARRAY_SIZE(rb4xx_pci_irqs), rb4xx_pci_irqs);
+}
+
+MIPS_MACHINE(AR71XX_MACH_RB_433U, "MikroTik RouterBOARD 433UAH", rb433u_setup);
+
static void __init rb450_setup(void)
{
rb4xx_generic_setup();
@@ -226,7 +252,27 @@
}
MIPS_MACHINE(AR71XX_MACH_RB_450, "MikroTik RouterBOARD 450", rb450_setup);
+static void __init rb450g_setup(void)
+{
+ rb4xx_generic_setup();
+ rb4xx_add_device_spi();
+ ar71xx_add_device_mdio(0xffffffe0);
+
+ ar71xx_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
+ ar71xx_eth0_data.phy_mask = 0x0000000f;
+ ar71xx_eth0_data.speed = SPEED_1000;
+ ar71xx_eth0_data.duplex = DUPLEX_FULL;
+
+ ar71xx_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_RMII;
+ ar71xx_eth1_data.phy_mask = 0x00000010;
+
+ ar71xx_add_device_eth(1);
+ ar71xx_add_device_eth(0);
+}
+
+MIPS_MACHINE(AR71XX_MACH_RB_450G, "MikroTik RouterBOARD 450G", rb450g_setup);
+
static void __init rb493_setup(void)
{
rb4xx_generic_setup();
Una vez aplicado arrancamos via tftpboot, previamente formateamos la memoria flash NAND desde la Bios:
comprobamos si la memoria fue detectada correctamente:
$ cat /proc/mtd dev: size erasesize name mtd0: 00040000 00040000 "booter" mtd1: 003c0000 00040000 "kernel" mtd2: 1fc00000 00040000 "rootfs"
mtd0 partición booter no nos interesa, mtd1 partición donde se guarda el kernel y finalmente partición mtd2 para filesystem raiz.
montamos la partición para el kernel:
root@OpenWrt:/# mount /dev/mtdblock1 /mnt/ yaffs: dev is 32505857 name is "mtdblock1" yaffs: passed flags "" yaffs: Attempting MTD mount on 31.1, "mtdblock1" yaffs: auto selecting yaffs2 yaffs_read_super: isCheckpointed 0 root@OpenWrt:/# ls /mnt/ lost+found root@OpenWrt:/# df -h Filesystem Size Used Available Use% Mounted on tmpfs 62.1M 52.0K 62.1M 0% /tmp tmpfs 512.0K 0 512.0K 0% /dev /dev/mtdblock1 3.8M 2.3M 1.5M 60% /mnt root@OpenWrt:/# find /mnt/ /mnt/ /mnt/lost+found
Aparentemente por un problema con el driver del soporte mtd la partición de 4mb aparece con 60% de espacio ocupado a pesar de estar literalmente vacía.
Nuestra imagen elf del kernel generalmente tendrá 2,5 Mb o más y no habrá manera de copiarla aquí.
la partición raiz se ve similar:
root@OpenWrt:/# df -h Filesystem Size Used Available Use% Mounted on tmpfs 62.1M 40.0K 62.1M 0% /tmp tmpfs 512.0K 0 512.0K 0% /dev /dev/mtdblock1 3.8M 2.3M 1.5M 60% /mnt /dev/mtdblock2 508.0M 2.3M 505.8M 0% /tmp/rootfs
Se necesitará extender mientras tanto la partición kernel de tal forma que sea posible ubicar nuestra imagen elf creada para tal fin.
En la mayoría de los sistemas embebidos (http://www.ssiembedded.com/embedded_linux_managing_memory.html), los dispositivos flash se usan directamente sin tabla de particiones, como otras memorias tales como las CF, que emulan discos duros. El driver de mapeo MTD provee funciones para leer/escribir en la memoria flash y aquí es donde se especifica una estructura de partición harcodeada. Vemos a continuación una porción del archivo rb4xx_nand.c que nos interesa:
Archivo trunk/target/linux/ar71xx/files/drivers/mtd/nand/rb4xx_nand.c:
static struct mtd_partition rb4xx_nand_partitions[] = {
{
.name = "booter",
.offset = 0,
.size = (256 * 1024),
.mask_flags = MTD_WRITEABLE,
},
{
.name = "kernel",
.offset = (256 * 1024),
.size = (4 * 1024 * 1024) - (256 * 1024),
},
{
.name = "rootfs",
.offset = MTDPART_OFS_NXTBLK,
.size = MTDPART_SIZ_FULL,
},
};
incrementamos el tamaño de la partición kernel a 8mb con el siguiente parche:
Index: trunk/target/linux/ar71xx/files/drivers/mtd/nand/rb4xx_nand.c
===================================================================
--- trunk/target/linux/ar71xx/files/drivers/mtd/nand/rb4xx_nand.c (revision 16778)
+++ trunk/target/linux/ar71xx/files/drivers/mtd/nand/rb4xx_nand.c (working copy)
@@ -92,7 +92,7 @@
{
.name = "kernel",
.offset = (256 * 1024),
- .size = (4 * 1024 * 1024) - (256 * 1024),
+ .size = (8 * 1024 * 1024) - (256 * 1024),
},
{
.name = "rootfs",
Recompilamos y booteamos Openwrt. Ahora la tabla de particiones se ve un poco diferente:
root@OpenWrt:~# cat /proc/mtd dev: size erasesize name mtd0: 00040000 00040000 "booter" mtd1: 007c0000 00040000 "kernel" mtd2: 1f800000 00040000 "rootfs" root@OpenWrt:/# df -h Filesystem Size Used Available Use% Mounted on tmpfs 62.1M 40.0K 62.0M 0% /tmp tmpfs 512.0K 0 512.0K 0% /dev /dev/mtdblock1 7.8M 2.3M 5.5M 29% /mnt
Con espacio suficiente para ubicar la imagen elf del kernel openwrt.
Siguiente paso montamos las particiones:
root@OpenWrt:/# mkdir /tmp/kernel root@OpenWrt:/# mkdir /tmp/rootfs root@OpenWrt:/# mount /dev/mtdblock1 /tmp/kernel/ root@OpenWrt:/# mount /dev/mtdblock2 /tmp/rootfs
debería verse asi:
root@OpenWrt:/# df -h Filesystem Size Used Available Use% Mounted on tmpfs 62.1M 40.0K 62.0M 0% /tmp tmpfs 512.0K 0 512.0K 0% /dev /dev/mtdblock1 7.8M 2.3M 5.5M 29% /tmp/kernel /dev/mtdblock2 504.0M 2.3M 501.8M 0% /tmp/rootfs
Finalmente compiamos la imagen openwrt-ar71xx-vmlinux.elf del kernel con el nombre “kernel” y desempaquetamos openwrt-ar71xx-rootfs.tgz en rootfs por ej con:
root@OpenWrt:/# tar -xzvf openwrt-ar71xx-rootfs.tgz -C /tmp/rootfs root@OpenWrt:/# umount /tmp/kernel root@OpenWrt:/# umount /tmp/rootfs root@OpenWrt:/# reboot
Tenemos Openwrt completamente funcional.
Exelente, gracias, voy a probarlo.
si tenes algo para la RB411U chiflame!!
saludos cordiales, leonel!
Publicado el 16 Julio 2010 a las 12:12. Permalink.