In questo blog, vi vorrei parlare di come montareSD Card in Android ed in particolare, come configurare Android in modo tale da effettui in maniera automatica il mount quando la risorsa è collegata al device. Inoltre, è stato considerato il caso in cui le risorse vengano montate in directory diverse da /mnt.
Il codice che troverete in questo blog è stato testato sul pannello touch Ltouch F specificatamente adatto per applicazioni industriali e domotica. Android Gingerbread è la versione che è stata utilizzata.
Montare una scheda SD in Android è un processo lineare. Ci potrebbero essere delle piccole differenze da versione a versione, ma i concetti chiave rimangono inalterati:
1. Identifica il sys_path della scheda SD. Vai a /dev/block/platform e visualizza la lista di tutte le directory. Nel mio caso, io trovo la seguente directory: s3c-sdhci.3. Ciò vuol dire che l’SD è stata inserita nello slot numero 3.
2. Per fare in modo che Android la carichi in maniera automatica quando la risorsa è stata inserita, bisogna modificare il file di configurazione vold.fstab. Questo file si trova solitamente in /system/etc e per modificarlo sono necessari i permessi di root.
Il pannello Android Ltouch F è un device già root, per cui non ci sono problemi ad accedere alla directory /system e modificare i file in essa contenuti. Se viceversa, disponete già di un device con i permessi di root (amministratore), usate i seguenti comandi:
adb remount
per montare la partizione system in scrittura (prima di aprire una shell Android) 3. Modificare il file vold.fstab attraverso il seguente comando:
busybox vi vold.fstab
In particolare, questo aprirà l’editor di testo vi. vold.fstab è un file di configurazione che è letto dal sistema Android per preparare e montare correttamente le schede SD e qualsiasi altra risorsa esterna (come per esempio flash memory USB). Ogni linea di questo file deve rispettare il seguente formato:
#######################
## Format: dev_mount <label> <mount_point> <part> <sysfs_path1…>
##
## label – Label for the volume
## mount_point – Where the volume will be mounted
## part – Partition # (1 based), or ‘auto’ for first usable partition.
## <sysfs_path> – List of sysfs paths to source devices
######################
Per cui, per esempio, se devi montare automaticamente la terza SD card in /mnt/sdcard basta aggiungere il seguente comando alla fine del file:
dev_mount sdcard /mnt/sdcard auto /devices/platform/s3c-sdhci.3/mmc_host/mmc3
dove “sdcard” è una label associata al volume (cioè alla risorsa), “/mnt/sdcard” è il path del punto di mount nel quale troverete i file della scheda SD oppure della flash memory, “auto” specifica quale partizione usare e, come la descrizione suggerisce, seleziona la prima partizione utile. L’ultimo parametro specifica il percorso della risorsa. Io ho usato /devices/platform/s3c-sdhci.3/mmc_host/mmc3 dove il path è formato da /devices/platform che è comune, mentre s3c-sdhci.3 deriva dal punto 1 e l’ultima parte mmc_host/mmcX caratterizza il numero ed il tipo di risorsa (X solitamente denota il numero dello slot SD).
Nel caso in cui dobbiate configurare un sistema Android con dual SD, ma il punto di mount /mnt/sdcard è già stato assegnato ad un altro volume, potete semplicemente aggiungere un punto di mount in un’altra posizione. Ricordate che la cartella /mnt è solitamente rimontata ad ogni riavvio del sistema per cui ogni modifica apportata sarà persa.
Supponiamo di dover creare un punto di mount nella cartella /system ed in particolare nella sottocartella /system/sdcard1. Per fare ciò, dovete:
- Creare la cartella /sdcard1
mkdir /system/sdcard1
- Assegnare i seguenti permessi:
chmod 0000 sdcard
- Cambiare il proprietario ed il gruppo a cui appartiene la directory attraverso il seguente comando:
chown 1000:1000 sdcard
- Modificare il file vold.fstab come sopra, ma usando il path nuovo:
dev_mount sdcard1 /system/sdcard1 auto /devices/platform/s3c-sdhci.3/mmc_host/mmc3
Notate che ho usato l’id utente 1000 (e non un identificativo stringa) dal momento che in Android (2.3) gli utenti sono codificati all’interno dei file sorgenti:
/* This is the master Users and Groups config for the platform.
** DO NOT EVER RENUMBER.
*/
#define AID_ROOT 0 /* traditional unix root user */
#define AID_SYSTEM 1000 /* system server */
#define AID_RADIO 1001 /* telephony subsystem, RIL */
#define AID_BLUETOOTH 1002 /* bluetooth subsystem */
#define AID_GRAPHICS 1003 /* graphics devices */
#define AID_INPUT 1004 /* input devices */
#define AID_AUDIO 1005 /* audio devices */
#define AID_CAMERA 1006 /* camera devices */
#define AID_LOG 1007 /* log devices */
#define AID_COMPASS 1008 /* compass device */
#define AID_MOUNT 1009 /* mountd socket */
#define AID_WIFI 1010 /* wifi subsystem */
#define AID_ADB 1011 /* android debug bridge (adbd) */
#define AID_INSTALL 1012 /* group for installing packages */
#define AID_MEDIA 1013 /* mediaserver process */
#define AID_DHCP 1014 /* dhcp client */
#define AID_SDCARD_RW 1015 /* external storage write access */
#define AID_VPN 1016 /* vpn system */
#define AID_KEYSTORE 1017 /* keystore subsystem */
#define AID_SHELL 2000 /* adb and debug shell user */
#define AID_CACHE 2001 /* cache access */
#define AID_DIAG 2002 /* access to diagnostic resources */
/* The 3000 series are intended for use as supplemental group id’s only.
* They indicate special Android capabilities that the kernel is aware of. */
#define AID_NET_BT_ADMIN 3001 /* bluetooth: create any socket */
#define AID_NET_BT 3002 /* bluetooth: create sco, rfcomm or l2cap sockets */
#define AID_INET 3003 /* can create AF_INET and AF_INET6 sockets */
#define AID_NET_RAW 3004 /* can create raw INET sockets */
#define AID_NET_ADMIN 3005 /* can configure interfaces and routing tables. */
#define AID_MISC 9998 /* access to misc storage */
#define AID_NOBODY 9999
#define AID_APP 10000 /* first app user */
Tutto qua. Fate il reboot del sistema e controllate che inserendo una nuova SD, verrà automaticamente montata da Android e resa disponibile all’utente.
Se vi è piaciuto questo articolo, per favore condividetelo! Come al solito, commenti e suggerimenti sono sempre ben accetti! 🙂