PDA

Ver la versión completa : [Info] Cómo mantener todas las roms en un mismo directorio



CoMiKe
26/11/2008, 00:57
Buenas a todos!

Pues nada, que ando un poco acarajao por aquí y he decidido que podía hacer algo que le pudiese ser útil a alguien.

Muchos de vosotros ya conocereis este "truco" (por llamarlo de alguna forma), pero me sorprende que el buscador no muestra resultados utilizando las palabras mount bind.

Existen varios emuladores que fuerzan a colocar las roms en un determinado directorio, en lugar de permitir al usuario colocarlas en donde le venga al pairo.

Pues bien, el comando "mount -o bind" permite montar los contenidos de un directorio en otro distinto.

La sintaxis del comando es la siguiente:

mount -o bind <directorio_origen> <directorio_destino>

Si no le veis la utilidad, os pongo un ejemplo del script que utilizo para lanzar el MAME4All (que, como sabemos, tan sólo permite colocar las roms dentro de la carpeta de instalación).


#!/bin/sh
mount -o bind /mnt/sd/roms/mame roms
./mame4all
umount roms

Este script monta el directorio /mnt/sd/roms/mame en el directorio roms de la carpeta actual, luego lanza el mame4all, y despues desmonta las roms de ese directorio para que no tengamos problemas.

Otro ejemplo? Pues lo mismo con el emulador de Amiga, UAE4All:


#!/bin/sh
mount -o bind /mnt/sd/roms/amiga roms
./uae4all -statusln 1 -soundrate 22050 -skipintro 1
umount roms

Bueno, pues espero que os sirva de ayuda para mejorar la organización de vuestras tarjetas SD.

Un saludo!

juanvvc
26/11/2008, 10:44
¡Buen apunte! No conocía la opción bind (¿seguro que se hace así? El manual dice que es -bind) Aunque en realidad los scripts deberían complicarse un poco más porque la mayor parte de los programas para Gp2x "no vuelven nunca". Así que 1.- no se pueden llamar sin más, hay que hacerles un 'exec' para no ir perdiendo memoria 2.- no se puede desmontar al final del script porque esa línea nunca se alcanza 3.- hay que comprobar al principio del script que no esté ya montado.

CoMiKe
26/11/2008, 12:53
¡Buen apunte! No conocía la opción bind (¿seguro que se hace así? El manual dice que es -bind)
Todos los scripts que he puesto están probados y los utilizo día a día, asi que no hay ningún problema con ellos.

Es cierto que en la versión actual de mount, la opción es mount --bind, pero parece que el firmware de la GP2X utiliza "busybox", y la versión de mount de busybox lleva la sintaxis que he puesto.

Aunque en realidad los scripts deberían complicarse un poco más porque la mayor parte de los programas para Gp2x "no vuelven nunca".
Cierto, pero utilizo el GMenu2X, y en estos programas tengo activada la opción de volver a lanzar el menú, así que eso que me ahorro en el script. :)

Así que 1.- no se pueden llamar sin más, hay que hacerles un 'exec' para no ir perdiendo memoria 2.- no se puede desmontar al final del script porque esa línea nunca se alcanza 3.- hay que comprobar al principio del script que no esté ya montado.
1. No sabía lo del exec, pero no le encuentro mucha lógica, aunque si tú lo dices, lo tendré que revisar, porque probablemente sepas bastante mejor que yo de lo que hablas.

2. Si que se alcanza esa línea, lo tengo probado en todos los emuladores que utilizo. Al menos en los emuladores que no vuelven a lanzar el menú, como estos dos ejemplos que he puesto.

3. Sí, comprobarlo es una opción, pero para eso los desmonto en cada ejecución. Además, si ya está montado, no hay ningún problema. Aunque mount de un error, el resto del script se va a seguir ejecutando y va a funcionar tal y como se diseño.

De todas formas. muchas gracias por tu interés, juanvvc. Espero que este truquito te pueda servir de ayuda.

Por cierto, para las roms de Atari2600, que son muchas y muy pequeñas y se hacen pesadísimas de copiar a la SD, utilizo el truco de meterlas en un solo fichero formateado como ext2, y luego monto ese fichero con mount -o loop en el directorio de ROMS de la Atari. Mano de santo, oiga! :angel1:

juanvvc
26/11/2008, 13:56
exec te sustituye el proceso actual por el que llamas en vez de hacer un fork+exec. Es decir, acabas inmediatamente el bash y lo cambias por el emulador. Las demás líneas después del exec no se ejecutan porque bash ya no existe. Exec es en realidad una llamada posix al sistema, y se puede hacer también dentro de los programas.

Por otro lado, en Gp2x hay dos formas de programar: que los programas salgan con un return 0, y poner luego un script que llame a gp2xmenu, o llamar a gp2xmenu con un exec dentro del programa/emulador (y por tanto, nunca "se saldrá" del emulador porque se sustituirá con el menú)

Creo que tu solución solo valdría en los programas del primer grupo, los que utilizan un script para llamar a gp2xmenu. En los del segundo la línea del umount no se alcanza nunca por el exec interno del emulador y por tanto es mejor hacer también un exec aquí y así te ahorras tener un bash en memoria esperando a un programa que nunca acabará.

Estoy bastante seguro de que mame4all llama a 'exec(/usr/bin/gp2xmenu)' al final de la ejecución, así que nunca volverá y el umount no lo ejecutará nunca, con lo que cada vez que lo ejecutes tendrás un nuevo bash ocupando memoria si no le pones el exec delante. De Ue4all no sé nada :)

bufalo_1973
26/11/2008, 15:05
Curioso que si se usa ext2 no hay necesidad de usar trucos. Con un "ln -s origen destino", arreglado.

juanvvc
26/11/2008, 17:05
Totalmente de acuerdo, bufalo. De hecho lo tuve así una temporada, pero que no pudiese leer la SD en cualquier ordenador acabó por hacerme volver a FAT :)

bufalo_1973
27/11/2008, 01:37
juanvvc, para eso está el ext2ifs (http://www.fs-driver.org/).