{"id":3271,"date":"2026-08-30T14:35:01","date_gmt":"2026-08-30T14:35:01","guid":{"rendered":"https:\/\/blog.rastersoft.com\/?p=3271"},"modified":"2026-08-30T14:35:02","modified_gmt":"2026-08-30T14:35:02","slug":"chroot-en-otras-arquitecturas","status":"publish","type":"post","link":"https:\/\/blog.rastersoft.com\/?p=3271","title":{"rendered":"CHROOT en otras arquitecturas"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Por circunstancias, hay veces que necesito compilar algo para una arquitectura para la que no tengo disponible un equipo f\u00edsico (por ejemplo, si quiero compilar algo para una SetTopBox con un procesador&#8230; MIPS o PowerPC). Para resolver ese problema, he escrito este peque\u00f1o script que permite lanzar una Debian de cualquier arquitectura soportada.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted mycode\">#!\/usr\/bin\/env python3\n\nimport sys\nimport os\nimport shutil\nimport subprocess\nimport logging\n\nversions = {\n    4: \"etch\",\n    5: \"lenny\",\n    6: \"squeeze\",\n    7: \"wheezy\",\n    8: \"jessie\",\n    9: \"stretch\",\n    10: \"buster\",\n    11: \"bullseye\",\n    12: \"bookworm\",\n    13: \"trixie\",\n    14: \"forky\",\n    15: \"duke\"\n}\n\nlog = logging.getLogger(__name__)\nlog.setLevel(logging.INFO)\n\ndef usage():\n    print(\"Usage: multiarch-chroot ARCH DEBIAN-VERSION PATH\")\n    print(\"  Creates a chroot environment\")\n    print(\"      ARCH can be powerpc, arm, arm64...\")\n    print(\"      DEBIAN-VERSION can be either a version number, or the version name (like trixie, or buster)\")\n    print(\"      PATH is the path where to create the CHROOT environment with the operating system files et al.\")\n    print(\"\")\n    print(\"multiarch-chroot launch PATH\")\n    print(\"  Launches a chroot environment in the specified path\")\n    sys.exit(-1)\n\ndef run_external_program(command, show_msg = True):\n    if show_msg:\n        log.info(f\"Launching external command {command}\")\n    return subprocess.run(command, shell=True).returncode\n\ndef download_debian(arch, version, path):\n    try:\n        version_number = int(version)\n        version = versions[version_number]\n    except:\n        pass\n\n    command = \"apt install -y qemu-user\"\n    run_external_program(command)\n    command = f\"debootstrap --foreign --variant=buildd --arch={arch} {version} {path} http:\/\/http.debian.net\/debian\/\"\n    run_external_program(command)\n    shutil.copy(f\"\/usr\/bin\/qemu-{arch}\", f\"{os.path.join(path, 'usr\/bin')}\")\n    command = f\"chroot {path} \/debootstrap\/debootstrap --second-stage\"\n    run_external_program(command)\n\nif os.getuid() != 0:\n    print(\"This program must be run as root\")\n    sys.exit(-1)\n\nif (len(sys.argv) != 4) and (len(sys.argv) != 3):\n    usage()\n\nif len(sys.argv) == 4:\n    download_debian(sys.argv[1], sys.argv[2], sys.argv[3])\n    sys.exit(0)\n\nif sys.argv[1] != \"launch\":\n    usage()\n\nrun_external_program(f\"chroot {sys.argv[2]} \/bin\/sh\")<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Para usarlo, primero se debe ejecutar con tres par\u00e1metros: la arquitectura (por ejemplo <em>arm64<\/em>), la versi\u00f3n de Debian a usar (puede ser tanto en n\u00famero como en <em>nombre<\/em>, por ejemplo <em>jessie<\/em>), y la ruta donde crear el sistema que se ejecutar\u00e1 dentro del <em>chroot<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez que ya tenemos el sistema operativo generado, s\u00f3lo tenemos que ejecutarlo, tambi\u00e9n como <em>root<\/em>, con el par\u00e1metro <em>launch<\/em> y la ruta, y entraremos dentro de la m\u00e1quina virtual donde podremos instalar paquetes, compilar cosas, etc.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Por circunstancias, hay veces que necesito compilar algo para una arquitectura para la que no tengo disponible un equipo f\u00edsico (por ejemplo, si quiero compilar algo para una SetTopBox con un procesador&#8230; MIPS o PowerPC). Para resolver ese problema, he escrito este peque\u00f1o script que permite lanzar una Debian de cualquier arquitectura soportada. #!\/usr\/bin\/env python3 &hellip; <a href=\"https:\/\/blog.rastersoft.com\/?p=3271\" class=\"more-link\">Seguir leyendo <span class=\"screen-reader-text\">CHROOT en otras arquitecturas<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,6],"tags":[],"class_list":["post-3271","post","type-post","status-publish","format-standard","hentry","category-programacion","category-trucos"],"_links":{"self":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/3271","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\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3271"}],"version-history":[{"count":2,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/3271\/revisions"}],"predecessor-version":[{"id":3273,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/3271\/revisions\/3273"}],"wp:attachment":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3271"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3271"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3271"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}