Preciso montar um pendrive antigo formatado com o sistema de arquivos FAT. A montagem deve ser executada automaticamente por uma udev
regra que execute um script bash.
Quando a chave USB é inserida na porta USB, o script executa o comando:
blkid -o udev /dev/sda1
onde /dev/sda1
está a partição presente dentro do USB e formatada com o sistema de arquivos FAT32. A saída do comando anterior para o pendrive está vazia .
A saída do mesmo comando ( blkid
) para outras chaves USB contém a udev
variável ID_FS_TYPE
; os valores possíveis ID_FS_TYPE
são: vfat
, ntfs
, exfat
.
Diferentes opções de mount
comando se o sistema de arquivos forvfat
Se o valor da variável ID_FS_TYPE
for vfat
o script deve executar o seguinte mount
comando:
> mount -o rw,relatime,users,gid=100,umask=000,shortname=mixed,utf8=1,flush /dev/sda1 /mount/point
Enquanto que se o sistema de arquivos não estiver, vfat
as opções para o mount
comando podem ser as seguintes:
mount -o rw,relatime /dev/sda1 /mount/point
Com a chave USB específica (1 GB e muito antiga), o script não consegue saber qual é o tipo de sistema de arquivos, vfat
então ele executa o segundo mount
comando; o resultado é que as permissões para o diretório do ponto de montagem (chamado /media/sda1
) são:
> ls -l /media/
total 16
drwxr-xr-x 3 root root 16384 Jan 1 1970 sda1
enquanto eu preciso:
# ls -l /media/
total 16
drwxrwxrwx 3 root root 16384 Jan 1 1970 sda1
Preciso dessas permissões porque todos os usuários devem poder escrever no USB e não apenas o proprietário (que é root
o meu contexto).
Encontre o tipo de sistema de arquivo por outros comandos
Este link dá outras dicas para descobrir o tipo de sistema de arquivos deste pendrive específico. Então, tentei outros comandos:
lsblk -n -o FSTYPE /dev/sda1
: também neste caso, para minha chave USB específica, a saída do comando está vazia- a saída do comando
file -sL /dev/sda1
é muito longa; mostro esta saída abaixo:
> file -sL /dev/sda1
/dev/sda1: DOS/MBR boot sector, code offset 0x3c+2, OEM-ID "MSDOS5.0", sectors/cluster 32, reserved sectors 8, root entries 512, Media descriptor 0xf8, sectors/FAT 240, sectors/track 63, heads 255, hidden sectors 2048, sectors 1966080 (volumes > 32 MB), reserved 0x1, serial number 0xa4906b9d, unlabeled, FAT (16 bit)
Nesta saída, a informação está presente FAT (16 bit)
, mas não fica claro se o sistema de arquivos da partição do pendrive está formatado vfat
. Se eu executar o comando anterior file -sL
em um pendrive formatado com o sistema de arquivos NTFS, a saída do comando será:
> file -sL /dev/sda
/dev/sda: DOS/MBR boot sector, code offset 0x52+2, OEM-ID "NTFS ", sectors/cluster 8, Media descriptor 0xf8, sectors/track 63, heads 255, dos < 4.0 BootSector (0x0), FAT (1Y bit by descriptor); NTFS, sectors/track 63, physical drive 0x80, sectors 15654911, $MFT start cluster 786432, $MFTMirror start cluster 2, bytes/RecordSegment 2^(-1*246), clusters/index block 1, serial number 030fcd5a9fcd56a1c; contains bootstrap BOOTMGR
Nesta saída está presente a string NTFS
, mas também está presente a string FAT
, então com esta saída não é fácil estabelecer se o sistema de arquivos é vfat
e não ntfs
.
A questão
Existe algum comando além dos anteriores que possa fornecer o sistema de arquivos de uma partição antes de montá-la?
Você pode usar
vol_id
o que deve ser capaz de detectar o sistema de arquivos, ele foi projetado para ser usado emudev
:Observe que, dependendo do tamanho da partição, algumas ferramentas criam partições FAT16 em vez de FAT32 quando você formata para FAT. Aliás, o vFAT suporta FAT16 e FAT32.
Atualização do seguinte comentário:
Uma alternativa para
vol_id
pode serlshw
:homem lshw
homem vol_id
lsblk -f
.... Não consigo imaginar uma distribuição moderna que não tenhalsblk
instalado.Com esta resposta e alguns outros ajustes, encontrei a solução para este estranho problema.
O único comando que fornece informações sobre o tipo de sistema de arquivos da partição presente no meu USB é
file -s /dev/sda1
command; então devo usá-lo para recuperar o tipo de sistema de arquivos.Modifiquei meu script desta forma:
No roteiro:
DEVICE
variável é/dev/sdX
(por exemplo/dev/sda1
)eval $(/sbin/blkid -o udev ${DEVICE})
tenta obter o tipo de sistema de arquivos naudev
variávelID_FS_TYPE
MOUNT_POINT
variável é o ponto de montagem no meu sistema de arquivosDesta forma, a antiga chave USB formatada pelo FAT32 (ou pelo FAT16) é montada automaticamente pelo script e todos os usuários do meu sistema podem escrever nela .