Montagem(8) com montagem(2)

Montagem(8) com montagem(2)

Eu tenho um software que desmontará uma partição programaticamente (se não estiver ocupada) e a montará novamente depois que todo o trabalho estiver concluído.

Se eu executar isso no terminal:

sudo mount /dev/sdb1 /mnt/fat32 -o sync,dirsync,rw,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,showexec,utf8,flush,errors=remount-ro -t vfat

Eu entendo isso /proc/self/mountinfo:

100 24 8:17 / /mnt/fat32 rw,relatime shared:61 - vfat /dev/sdb1 rw,sync,dirsync,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,showexec,utf8,flush,errors=remount-ro

Então fiz um analisador mountinfo e para obter os dados para restaurar a montagem, mas estou tendo dificuldades para converter opções de montagem ( rw,relatime) e super opções (a última parte em /mountinfo: rw,sync,dirsync,...) com mountoptionse data:

int mount(const char *source, const char *target,
          const char *filesystemtype, unsigned long mountflags,
          const void *data);

Minha abordagem foi converter as opções de montagem nas opções apropriadas mountflagse fornecer opções especiais diretamente para data, mas recebo este erro:

[62857.390803] FAT-fs (sdb1): Unrecognized mount option "rw" or missing value

Então criei uma função para copiar os atributos nas super opções que apenas correspondem aos dados específicos do sistema de arquivos e agora funciona. Mas ainda tenho um problema: como posso definir, por exemplo, synce dirsyncse eles não estão nos sinalizadores de opções de montagem e se não são para atributos específicos do vfat?

Se pode ser feito através da montagem da linha de comando também pode ser feito na versão da linha de comando, certo?

Responder1

Alguns dos parâmetros dadosmount(8)são traduzidos para sinalizadores especificados no mountflagsparâmetro paramount(2):

  • syncé MS_SYNCHRONOUS;
  • dirsyncé MS_DIRSYNC;
  • relatimeé MS_RELATIME;
  • rwé o padrão, portanto não pode ser especificado; roseria MS_RDONLY.

Responder2

Então eu fiz um mountinfoanalisador[…]

É melhor usar setmntent()e getmntent()que são fornecidos na biblioteca de tempo de execução GNU C.

Minha abordagem foi converter as opções de montagem nas apropriadas mountflagse fornecer opções especiais diretamente paradata[…]

O que você precisa fazer é pegar o mnt_optsby fornecido getmntent()e processá-lo em flagse data. O mountcomando do util-linuxpacote depende de uma biblioteca para isso, chamadamontagem da biblioteca. Algumas delas são baseadas em tabelas, a partir de longas tabelas específicas do Linux.

Leitura adicional

  • "O mtabarquivo".O Manual de Referência da Biblioteca GNU C. 2.23. Fundação de Software Livre. 2016.
  • Karel Zak (2012). "Opções de montagem".Manual de referência do libmount. 2.21. Arquivos do Kernel Linux.

informação relacionada