{"id":292,"date":"2009-10-02T02:28:36","date_gmt":"2009-10-02T00:28:36","guid":{"rendered":"http:\/\/blog.rastersoft.com\/?p=292"},"modified":"2015-08-15T17:54:22","modified_gmt":"2015-08-15T17:54:22","slug":"emergiendo","status":"publish","type":"post","link":"https:\/\/blog.rastersoft.com\/?p=292","title":{"rendered":"Emergiendo"},"content":{"rendered":"<p><strong>Actualizado. <\/strong>Hace unos d\u00edas encontr\u00e9 una <a href=\"http:\/\/rtd1261.wikidot.com\/\" target=\"_blank\">p\u00e1gina sobre discos duros multimedia basados en procesador MIPS<\/a>. Aunque no es sobre el mismo modelo que mi disco, s\u00ed tiene cosas lo suficientemente parecidas como para que funcione. Una de ellas es la idea de utilizar una<a href=\"http:\/\/rtd1261.wikidot.com\/tweaking-the-official-firmware#toc11\" target=\"_blank\"> Debian para MIPS mediante <strong>chroot<\/strong><\/a> para poder a\u00f1adir cosas extra.<\/p>\n<p>Aunque la idea es buena, por cuestiones personales prefer\u00eda utilizar <a href=\"http:\/\/www.gentoo.org\" target=\"_blank\">Gentoo<\/a>, as\u00ed que me baj\u00e9 la stage3 para MIPS, la copi\u00e9 en el disco duro e intent\u00e9 hacer un chroot. Pero como siempre, las cosas nunca son sencillas: dec\u00eda que no pod\u00eda ejecutar bash. Extra\u00f1ado, copi\u00e9 el ejecutable a mi equipo de sobremesa y lo analic\u00e9 con <a href=\"http:\/\/live.gnome.org\/Ghex\" target=\"_blank\">GHex<\/a>, compar\u00e1ndolo con el ejecutable de BusyBox.<\/p>\n<p>El problema result\u00f3 ser que los <a href=\"http:\/\/www.debian.org\/ports\/mips\/\" target=\"_blank\">stages de Gentoo para MIPS est\u00e1n en formato big-endian, mientras que mi disco duro trabaja en little-endian<\/a> (parece ser que los procesadores MIPS, aunque pueden trabajar con ambos formatos, no pueden utilizarlos a la vez, sino que se escoge a nivel hardware durante el arranque). Cuando un sistema trabaja en little-endian se dice que es un <strong>MIPSel<\/strong>.<\/p>\n<p>Rebuscando encontr\u00e9 unos <em>stages<\/em> para <em>MIPSel<\/em>, pero eran del a\u00f1o 2005. Intent\u00e9 usarlos y, aunque funcionaban, en cuanto intentaba actualizar el sistema al m\u00e1s reciente, fallaba (todo apuntaba a la versi\u00f3n de python, que era demasiado vieja para ejecutar el \u00faltimo portage). Segu\u00ed buscando y encontr\u00e9 que las estaciones de trabajo Cobalt trabajaban en little-endian, as\u00ed que prob\u00e9 de nuevo con unos stages dise\u00f1ados para ellas, pero segu\u00eda fallando.<\/p>\n<p>Decid\u00ed entonces probar con la Debian de la p\u00e1gina inicial, pero al hacer un dist-upgrade volv\u00eda a fallar.<\/p>\n<p>Ante esto, decid\u00ed que s\u00f3lo ten\u00eda dos opciones: o utilizaba s\u00f3lo <a href=\"http:\/\/en.wikipedia.org\/wiki\/Cross_compiler\" target=\"_blank\">cross-compiling<\/a>, o intentaba generar yo mismo un stage de Gentoo para MIPSel. Como no pod\u00eda ser de otra manera, tir\u00e9 por la segunda \ud83d\ude42 Por supuesto, es la primera vez que lo hago, as\u00ed que, aunque me ha funcionado, puede ser que haya metido la pata en algo, o que alguna cosa se pueda hacer mejor, as\u00ed que los comentarios est\u00e1n abiertos para cualquier sugerencia o correcci\u00f3n.<\/p>\n<p><span style=\"color: #ff0000;\"><strong>AVISO<\/strong><\/span><span style=\"color: #ff0000;\">:<\/span> <strong>a partir de aqu\u00ed empiezo a tocar en el sistema operativo del disco duro multimedia, lo que significa que estas acciones s\u00f3lo las deben realizar aquellos que sepan muy bien lo que hacen. Si alguien se carga su disco, ser\u00e1 el \u00fanico responsable.<br \/>\n<\/strong><\/p>\n<p><strong>Avisados est\u00e1is.<\/strong><\/p>\n<p>Lo primero que hice fue instalar una Gentoo para<em> x86<\/em> en mi sistema. Pero como no quer\u00eda formatear mi actual Ubuntu, decid\u00ed hacer una instalaci\u00f3n <em>virtual<\/em>. Veamos como:<\/p>\n<p>Para empezar, descargamos las versiones m\u00e1s recientes del <a href=\"http:\/\/mirrors.kernel.org\/gentoo\/releases\/x86\/current-stage3\/\" target=\"_blank\">stage3<\/a> y el <a href=\"http:\/\/mirrors.kernel.org\/gentoo\/releases\/snapshots\/current\/\" target=\"_blank\">portage<\/a> de Gentoo, y las descomprimimos en un directorio (el portage se descomprime dentro del directorio <strong>\/usr<\/strong> del stage3), en mi caso llamado <strong>gentoo<\/strong>:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">mkdir \/home\/raster\/gentoo\r\nsudo tar -xjvf stage3-i686-20090915.tar.bz2 -C \/home\/raster\/gentoo\/\r\nsudo tar -xjvf portage-lastest.tar.bz2 -C \/home\/raster\/gentoo\/usr\/<\/pre>\n<\/div>\n<p>La raz\u00f3n de utilizar <strong>sudo<\/strong> es que, si no, no podr\u00e1 crear algunos ficheros especiales en el directorio.<\/p>\n<p>A continuaci\u00f3n montamos una copia de los sistemas de archivos especiales de Linux (<em>\/proc<\/em>, <em>\/dev<\/em>, <em>\/dev\/pts<\/em> y <em>\/sys<\/em>), adem\u00e1s de copiar el fichero<em> resolv.conf<\/em> para poder conectarnos a Internet. Sin ellos no podr\u00edamos hacer muchas cosas b\u00e1sicas:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">sudo mount -o bind \/proc \/home\/raster\/gentoo\/proc\r\nsudo mount -o bind \/dev \/home\/raster\/gentoo\/dev\r\nsudo mount -o bind \/dev\/pts \/home\/raster\/gentoo\/dev\/pts\r\nsudo mount -o bind \/sys \/home\/raster\/gentoo\/sys\r\nsudo cp \/etc\/resolv.conf \/home\/raster\/gentoo\/etc\/resolv.conf<\/pre>\n<\/div>\n<p>Notar el par\u00e1metro <em>-o bind<\/em> en mount: lo que hace es coger un sistema de archivos ya montado y montarlo tambi\u00e9n en el nuevo directorio, de manera que est\u00e9 disponible en ambos a la vez.<\/p>\n<p>Por \u00faltimo, hacemos un chroot para entrar en el sistema:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">sudo chroot \/home\/raster\/gentoo\/ \/bin\/bash<\/pre>\n<\/div>\n<p>Ya estamos dentro de nuestra Gentoo, pero antes de empezar tenemos que cargar el entorno:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">env-update\r\nsource \/etc\/profile<\/pre>\n<\/div>\n<p>Con \u00e9sto ya podemos empezar a trabajar. Lo primero es actualizar todo el sistema a los \u00faltimos paquetes, para lo que hacemos:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">emerge --sync\r\nemerge --update --deep world<\/pre>\n<\/div>\n<p>Y ya podemos empezar a crear nuestro stage. Lo primero es instalar <em>crossdev<\/em>, un paquete que automatiza la generaci\u00f3n de entornos de compilaci\u00f3n cruzada (la documentaci\u00f3n oficial est\u00e1 <a href=\"http:\/\/www.gentoo.org\/proj\/en\/base\/embedded\/cross-development.xml\" target=\"_blank\">aqu\u00ed<\/a> y <a href=\"http:\/\/www.gentoo.org\/proj\/en\/base\/embedded\/handbook\/index.xml?part=1&amp;chap=4\" target=\"_blank\">aqu\u00ed<\/a>):<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">emerge portage-utils crossdev<\/pre>\n<\/div>\n<p>A continuaci\u00f3n, editamos el fichero <em>\/etc\/make.conf<\/em> y a\u00f1adimos la l\u00ednea <em>PORTDIR_OVERLAY=\/usr\/local\/portage<\/em> (podemos utilizar el editor nano, o vi) y, opcionalmente, la l\u00ednea <em>MAKEOPTS=\u00bb-jX\u00bb<\/em> (siendo X el n\u00famero de procesadores m\u00e1s 1; yo, como tengo un doble n\u00facleo, uso -j3). Por \u00faltimo, creamos el directorio <em>\/usr\/local\/portage<\/em>, y ya podemos generar un compilador para MIPSel, linux, y uclibc:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">crossdev -v --target mipsel-unknown-linux-uclibc<\/pre>\n<\/div>\n<p>Las distintas combinaciones de procesadores, n\u00facleos y bibliotecas est\u00e1n en la <a href=\"http:\/\/www.gentoo.org\/proj\/en\/base\/embedded\/cross-development.xml\" target=\"_blank\">documentaci\u00f3n de crossdev<\/a>, en una tabla.<\/p>\n<p>Se tirar\u00e1 un buen rato compilando, tras el cual podemos comprobar si todo fue correctamente con:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">gcc-config -l<\/pre>\n<\/div>\n<p>En mi caso devuelve:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">[1] i686-pc-linux-gnu-4.3.2 *\r\n[2] mipsel-unknown-linux-uclibc-4.3.4 *<\/pre>\n<\/div>\n<p>Con este toolchain podremos compilar cosas de manera nativa pra el disco duro. Para probarlo escribimos el t\u00edpico <em>Hola mundo<\/em> y lo compilamos con:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">mipsel-unknown-linux-uclibc-gcc -o holamundo holamundo.c<\/pre>\n<\/div>\n<p>lo copiamos al disco duro multimedia y probamos a ejecutarlo. Deber\u00eda funcionar a la primera.<\/p>\n<p>Una vez que tenemos el toolchain para compilaci\u00f3n cruzada, vamos a crear nuestra stage. Para ello tenemos que instalar el paquete crossdev-wrappers, tal y como se <a href=\"http:\/\/gentoo.mindzoo.de\/index.cgi\/wiki\/cross-compiling\" target=\"_blank\">explica en su p\u00e1gina<\/a>, e inicializarlo. Por desgracia, por defecto est\u00e1 enmascarado, as\u00ed que tenemos que desenmascararlo para que podamos instalarlo. Para ello escribimos:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">echo \"sys-devel\/crossdev-wrappers ~* *\" &gt;&gt; \/etc\/portage\/package.keywords\/i686-unknown-linux-gnu<\/pre>\n<\/div>\n<p>Asumiendo, por supuesto, que <em>\/etc\/portage\/package.keywords<\/em> es un directorio. Si es un fichero, entontes ser\u00eda<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">echo \"sys-devel\/crossdev-wrappers ~* *\" &gt;&gt; \/etc\/portage\/package.keywords<\/pre>\n<\/div>\n<p>Ahora ya podemos instalar crossdev-wrappers:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">emerge crossdev-wrappers\r\nemerge-wrapper --init<\/pre>\n<\/div>\n<p>Este paquete nos permite instalar cualquier paquete de Gentoo, pero compil\u00e1ndolo para el sistema para el que tenemos compilador cruzado, e instalando el sistema de archivos en un directorio aparte (por defecto en <strong>\/usr\/arquitectura<\/strong>; o sea, <em>\/usr\/mipsel-unknown-linux-uclibc<\/em> en este caso), que podremos comprimir con <em>tar<\/em> e instalar en el sistema destino. Pero antes de empezar a utilizarlo tenemos que configurarlo adecuadamente. Lo primero es editar el fichero <em>\/usr\/mipsel-unknown-linux-uclibc\/etc\/make.conf<\/em> y ajustarlo a nuestros intereses. En mi caso, por defecto estaba as\u00ed:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">CHOST=mipsel-unknown-linux-uclibc\r\nCBUILD=i686-pc-linux-gnu\r\nARCH=mips\r\n\r\nHOSTCC=i686-pc-linux-gnu-gcc\r\nE_MACHINE=EM_MIPS\r\n\r\nROOT=\/usr\/${CHOST}\/\r\n\r\nACCEPT_KEYWORDS=\"mips ~mips\"\r\n\r\nUSE=\"${ARCH} zlib bindist make-symlinks minimal\"\r\n\r\n#MARCH_TUNE=\"-march=armv4t -mtune=arm9tdmi\"\u00a0\u00a0\u00a0\u00a0 #arm-softfloat-linux-uclibc\r\n#MARCH_TUNE=\"-march=armv5t -mtune=xscale\"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 #armv5teb-softfloat-linux-gnueabi\r\n\r\nCFLAGS=\"-Os -pipe ${MARCH_TUNE} -fomit-frame-pointer -I${ROOT}usr\/include\/ -I${ROOT}include\/\"\r\nCXXFLAGS=\"${CFLAGS}\"\r\nLDFLAGS=\"-L${ROOT}lib -L${ROOT}usr\/lib\"\r\n\r\nFEATURES=\"-collision-protect sandbox buildpkg noman noinfo nodoc\"\r\n# Be sure we dont overwrite pkgs from another repo..\r\nPKGDIR=${ROOT}packages\/\r\nPORTAGE_TMPDIR=${ROOT}tmp\/\r\n\r\nELIBC=\"glibc\"\r\n\r\nPKG_CONFIG_PATH=\"${ROOT}usr\/lib\/pkgconfig\/\"\r\n#PORTDIR_OVERLAY=\"\/usr\/portage\/local\/\"\r\n\r\nLIBDIR_${ARCH}=\"lib\"\r\nLIBDIR_amd64=lib64\r\nMAKEOPTS=-j2<\/pre>\n<\/div>\n<p>Hay varios cambios a realizar. Para empezar, hay que a\u00f1adir <strong>MARCH_TUNE=\u00bb-march=4kec\u00bb<\/strong>, de manera que optimicemos para el procesador espec\u00edfico de mi disco duro (esto hay que cambiarlo para el modelo espec\u00edfico del procesador del disco duro que se quiera utilizar). Por otro lado, hay que cambiar <em>MAKEOPTS=-j2<\/em> por <strong>MAKEOPTS=-j3<\/strong>, porque yo tengo dos n\u00facleos. Al final tenemos:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">CHOST=mipsel-unknown-linux-uclibc\r\nCBUILD=i686-pc-linux-gnu\r\nARCH=mips\r\nMARCH_TUNE=\"-march=4kec\"\r\n\r\nHOSTCC=i686-pc-linux-gnu-gcc\r\nE_MACHINE=EM_MIPS\r\n\r\nROOT=\/usr\/${CHOST}\/\r\n\r\nACCEPT_KEYWORDS=\"mips ~mips\"\r\n\r\nUSE=\"${ARCH} zlib bindist make-symlinks minimal\"\r\n\r\nCFLAGS=\"-Os -pipe ${MARCH_TUNE} -fomit-frame-pointer -I${ROOT}usr\/include\/ -I${ROOT}include\/\"\r\nCXXFLAGS=\"${CFLAGS}\"\r\nLDFLAGS=\"-L${ROOT}lib -L${ROOT}usr\/lib\"\r\n\r\nFEATURES=\"-collision-protect sandbox buildpkg noman noinfo nodoc\"\r\n# Be sure we dont overwrite pkgs from another repo..\r\nPKGDIR=${ROOT}packages\/\r\nPORTAGE_TMPDIR=${ROOT}tmp\/\r\n\r\nELIBC=\"glibc\"\r\n\r\nPKG_CONFIG_PATH=\"${ROOT}usr\/lib\/pkgconfig\/\"\r\n#PORTDIR_OVERLAY=\"\/usr\/local\/portage\"\r\n\r\nLIBDIR_${ARCH}=\"lib\"\r\nLIBDIR_amd64=lib64\r\nMAKEOPTS=-j3<\/pre>\n<\/div>\n<p>Tambi\u00e9n hay que ajustar el perfil deseado. Por defecto nos ha puesto embedded, que es perfecto para nuestro caso; pero si queremos cambiarlo basta con borrar <em>\/usr\/mipsel-unknown-linux-uclibc\/etc\/make.profile<\/em> y enlazarlo al perfil deseado de los disponibles en <em>\/usr\/portage\/profiles<\/em>.<\/p>\n<p>Y ya s\u00f3lo queda por compilar todos los paquetes que queramos, utilizando el comando <em>emerge-mipsel-unknown-linux-uclibc<\/em>. As\u00ed, el primero que, probablemente, queramos instalar ser\u00e1 <em>system<\/em>.<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">emerge-mipsel-unknown-linux-uclibc system<\/pre>\n<\/div>\n<p>que instalar\u00e1 <em>BusyBox<\/em> con todas las librer\u00edas de <em>uClinux<\/em>. Una vez hecho esto s\u00f3lo tenemos que crear los directorios que faltan con:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">cd \/usr\/mipsel-unknown-linux-uclibc\r\nmkdir dev proc root sys<\/pre>\n<\/div>\n<p>y ya tendremos un sistema de ficheros que podremos probar. Para ello basta con empaquetarlo con <em>tar<\/em> (no comprimirlo, porque al menos mi disco duro no tiene ni <em>gzip<\/em> ni <em>bzip2<\/em>), descomprimirlo en el disco duro, montar <em>proc<\/em>, <em>dev<\/em>, <em>dev\/pts<\/em> y <em>sys<\/em> como al principio de esta entrada, copiar <em>\/etc\/resolv.conf<\/em> y hacer un <em>chroot<\/em>, aunque esta vez con <em>\/bin\/ash<\/em>, porque <em>busybox<\/em> no dispone de <em>bash<\/em>.<\/p>\n<p>Otra cosa que podemos hacer es a\u00f1adir en<em>\/usr\/mipsel-unknown-linux-uclibc\/etc\/make.conf<\/em> una l\u00ednea USE con las opciones que nos interesen de cara a compilar (<a href=\"http:\/\/www.gentoo.org\/dyn\/use-index.xml\" target=\"_blank\">opciones que se pueden consultar aqu\u00ed<\/a>).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Actualizado. Hace unos d\u00edas encontr\u00e9 una p\u00e1gina sobre discos duros multimedia basados en procesador MIPS. Aunque no es sobre el mismo modelo que mi disco, s\u00ed tiene cosas lo suficientemente parecidas como para que funcione. Una de ellas es la idea de utilizar una Debian para MIPS mediante chroot para poder a\u00f1adir cosas extra. Aunque &hellip; <a href=\"https:\/\/blog.rastersoft.com\/?p=292\" class=\"more-link\">Seguir leyendo <span class=\"screen-reader-text\">Emergiendo<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,7],"tags":[],"class_list":["post-292","post","type-post","status-publish","format-standard","hentry","category-cacharreo","category-tutoriales"],"_links":{"self":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/292","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=292"}],"version-history":[{"count":2,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/292\/revisions"}],"predecessor-version":[{"id":1895,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/292\/revisions\/1895"}],"wp:attachment":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=292"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=292"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=292"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}