Por que não posso atribuir permissões de execução a um arquivo no cartão SD?

10
shell@android:/sdcard/SW # ls -l
-rw-rw-r-- root     sdcard_rw      128 2012-09-22 11:42 usb0config.sh
shell@android:/sdcard/SW # chmod 777 usb0config.sh                             
shell@android:/sdcard/SW # ls -l
-rw-rw-r-- root     sdcard_rw      128 2012-09-22 11:42 usb0config.sh
shell@android:/sdcard/SW # 

Por que não posso atribuir permissões de execução a um arquivo no cartão SD?

$ adb shell su -c mount |grep -si sdcard
/dev/block/vold/179:97 /mnt/ext_sdcard vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0002,dmask=0002,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
tmpfs /mnt/ext_sdcard/.android_secure tmpfs ro,relatime,size=0k,mode=000 0 0
/dev/fuse /mnt/sdcard fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0


$ adb shell su -c "mount -t vfat -o umask=0000 /dev/fuse /mnt/sdcard"
mount: Block device required

Agora parece remontar com sucesso.

$ adb shell su -c "mount -t vfat -o remount,umask=0000 /dev/fuse /mnt/sdcard"

mas o arquivo ainda não pode ser atribuído ao modo 777.

shell@android:/sdcard/Sw # ls -l
-rw-rw-r-- root     sdcard_rw      128 2012-09-22 11:42 usb0config.sh
shell@android:/sdcard/Sw # chmod 777 usb0config.sh                             
shell@android:/sdcard/Sw # ls -l
-rw-rw-r-- root     sdcard_rw      128 2012-09-22 11:42 usb0config.sh

As informações de montagem não mudam em comparação com as remontagens anteriores.

$ adb shell su -c mount |grep -si sdcard
/dev/block/vold/179:97 /mnt/ext_sdcard vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0002,dmask=0002,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
tmpfs /mnt/ext_sdcard/.android_secure tmpfs ro,relatime,size=0k,mode=000 0 0
/dev/fuse /mnt/sdcard fuse rw,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
Victor S
fonte

Respostas:

15

A menos que você tenha feito algo incomum com o seu dispositivo, o cartão SD será formatado como um sistema de arquivos FAT, que não suporta permissões de arquivo * nix. Esta entrada das Perguntas frequentes do Linux de um dos professores do MIT explica um pouco e também explica como você pode potencialmente usar as opções de montagem para alterar o modo de permissão do dispositivo (isso exigiria root e afetaria todos os arquivos / pastas no dispositivo) . Além disso, o cartão SD no Android é montado por padrão com a -noexecbandeira.

Para o bit exec, você provavelmente desejaria remontar com uma umask de 0000, uma vez que a umask é essencialmente um binário NÃO das permissões que você deseja (portanto, umask 0000diz que não mascara nenhuma permissão, permita todas). Não testado, mas fazê-lo temporariamente seria algo parecido com:

mount -t vfat -o umask=0000 /dev/your/sdcard/device /mnt/sdcard

O ponto de montagem pode precisar ser alterado /mnt/sdcardpara algo ligeiramente diferente, dependendo do seu dispositivo. Novamente, porém, acredito mountque requer que você tenha permissões de root para isso.

eldarerathis
fonte
Eu tento remontar usando seu comando deu, mas falhou, por favor veja o suplemento da minha pergunta.
22612 Victor S #
consulte a atualização da minha pergunta.
22712 Victor S #
11
@ Victor: Parece que você tem um cartão SD interno e um externo. O interno não é tratado da mesma maneira, e não sei se existe uma maneira de montá-lo novamente com as permissões desejadas. Como alternativa, no entanto, você pode executar o script de sh invocação: sh usb0config.sh.
Eldarerathis 22/09/12