Estoy tratando de montar un directorio de origen desde el servidor nfs a un directorio de destino en una placa incrustada con linux. El siguiente comando funciona perfectamente como se esperaba en el indicador de shell en el tablero.

mount -t nfs -o nolock 10.126.62.45:/vol/home/avinoba/Sky /mnt

¿Cuál es la llamada al sistema equivalente que se utilizará en el programa para el comando anterior? Intenté la siguiente llamada pero el montaje falló con "Argumento no válido"

if(mount("10.126.62.45:/vol/home/avinoba/Sky","/mnt","nfs",MS_MGC_VAL,"nolock") == -1)
{
     printf("ERROR: mount failed: %s \n",strerror(errno));
}

Sugiera cuál es la solución.

Gracias

4
Avinob Aich 5 feb. 2015 a las 21:01

3 respuestas

La mejor respuesta

Estoy bastante sorprendido de saber que esto no está cubierto por ninguna página de manual con respecto a los montajes NFS. Buceando en el código del kernel, en la función nfs_validate_text_mount_data , la función nfs_parse_mount_options es responsable de analizar las múltiples opciones separadas por comas pasadas como el quinto argumento en el montaje llamada al sistema.

struct sockaddr *sap = (struct sockaddr *)&args->nfs_server.address;

if (nfs_parse_mount_options((char *)options, args) == 0)
    return -EINVAL;

if (!nfs_verify_server_address(sap))
    goto out_no_address;

En el bloque de código anterior, la última instrucción if comprueba si la dirección del servidor nfs y la familia de sockets están definidas con valores válidos. Si no se actualizan dentro de nfs_parse_mount_options , mount terminaría devolviendo un parámetro no válido.

Si se recorre la implementación de nfs_parse_mount_options , se puede ver que, solo para el caso Opt_addr , la dirección del servidor nfs y la familia de sockets se actualizan al analizar el Opciones argumento.

case Opt_addr:
    string = match_strdup(args);
    if (string == NULL)
        goto out_nomem;
    mnt->nfs_server.addrlen =
        rpc_pton(mnt->net, string, strlen(string),
            (struct sockaddr *)
            &mnt->nfs_server.address,
            sizeof(mnt->nfs_server.address));
    kfree(string);
    if (mnt->nfs_server.addrlen == 0)
        goto out_invalid_address;
    break;

El caso Opt_addr corresponde a la opción "addr = nfs server ip" . Entonces, para que la llamada al sistema funcione, definir esta opción es imprescindible . Por lo que he buscado, esto falta por completo en todas las páginas de manual que describen los montajes de nfs.

Entonces, considerando la declaración del problema, intente cambiar al siguiente código

if(mount(":/vol/home/avinoba/Sky","/mnt","nfs",0,"nolock,addr=10.126.62.45") == -1)
{
     printf("ERROR: mount failed: %s \n",strerror(errno));
}

También tenga en cuenta que cuando se coloca la opción addr en el argumento, la dirección IP delante de la ruta del servidor nfs se vuelve opcional. Sin embargo, el ':' es obligatorio, ya que actúa como delimitador para analizar la ruta del servidor nfs.

14
Abhijit 10 feb. 2015 a las 20:14

Se solucionó con la siguiente llamada para mí ahora.

if(system("mount -t nfs -o nolock 10.126.62.45:/vol/home/avinoba/Sky /mnt")==-1);
{
     printf("ERROR: mount failed \n");
}

Pero sigue buscando la respuesta con la llamada mount () ya que acepta el argumento 'tipo de sistema de archivos' como "nfs".

0
Avinob Aich 6 feb. 2015 a las 18:17

MS_MGC_VAL debe estar en los 16 bits superiores si es necesario, no en la parte inferior. Si la versión de su kernel es> 2.4, no la necesita en absoluto.

0
mpez0 5 feb. 2015 a las 18:43