/ / Montar dispositivo NTFS em C ++ no linux? - c ++, linux, montagem

Montar o dispositivo NTFS em C ++ no linux? - c ++, linux, montagem

Eu estou tentando montar uma unidade externa no meu aplicativo C ++. Eu originalmente tentei usar o mount (2), mas isso falha:

int ret = mount(deviceName.c_str(), mountPoint.c_str(), fsType.c_str(), 0, NULL);

errno é 19, ENODEV (tipo de sistema de arquivos não configurado no kernel)

No entanto, se eu mudar para o uso do mount (8), ele funciona bem:

std::string cmd = "mount -t " + fsType + " " + deviceName + " " + mountPoint;
int ret = system(cmd.c_str());

O mount (2) tem uma lista diferente de tipos aceitáveis ​​de sistemas de arquivos? Este é um dispositivo NTFS, então eu estava usando ntfs-3g como o fstype. Eu verifiquei / proc / filesystems e vi que isso não foi listado, então eu tentei fuseblk mas isso apenas muda o erro para 22, EINVAL.

Qual é a maneira correta de montar dispositivos NTFS usando o mount (2)?

Respostas:

4 para resposta № 1

mount.2 é apenas uma chamada do kernel. mount.8 é uma ferramenta externa completa que é estendida além do que o kernel faz.

Acho que você pode estar procurando libmount que é uma biblioteca que implementa toda a mágica de montagem feita por mount.8. Versões de montagem mais recentes também são usadas. É fornecido em util-linux.


2 para resposta № 2

Você já tentou correr mount(8) usando o strace comando? Ele irá imprimir as chamadas do sistema feitas pelo programa, incluindo mount(2). Quando eu faço essa montagem, ela desova mount.ntfs (que é NTFS-3g), que então faz uma mount para fuseblk e, em seguida, gira em segundo plano para suportar esse ponto de montagem.

Os sistemas de arquivos baseados em FUSE são tratados de maneira diferente porque o daemon de espaço do usuário deve ser iniciado. Montagem com fuseblk não fornece informação suficiente para o kernel iniciar o daemon (e o kernel nem sequer tem a informação para iniciar o daemon). Para o ntfs-3g, normalmente faria algo como ntfs-3g /dev/sda1 /mnt/windows (da ajuda). Não existe uma maneira programática de dizer ao kernel para fazer isso porque acontece no espaço do usuário.