2015-02-05 2 views
2

Я пытаюсь установить исходный каталог с сервера nfs в каталог назначения во встроенной плате с linux. Следующая команда работает отлично, как ожидалось, в командной строке на плате.NFS mount Системный вызов в linux

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

Что такое эквивалентный системный вызов, который будет использоваться в программе для команды выше? Я попытался ниже вызова, но гора не удалась с «недопустимым аргументом»

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)); 
} 

Пожалуйста, предложить то, что подходит для него.

Благодаря

+0

У вас может быть 'strace'-ed команда' mount', чтобы найти точные syscalls, которые она делает –

ответ

8

Я очень удивлен здесь, зная, что это не распространяется на любую страницу руководства относительно монтирования NFS. Погружение в коде ядра, в функции nfs_validate_text_mount_data, функция nfs_parse_mount_options отвечает за разбор нескольких разделенных запятыми параметров, передаваемых в качестве пятого аргумента в монтирования системный вызов.

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; 

В приведенном выше кодовом блоке последний оператор if проверяет, соответствует ли адрес сервера nfs и семейство сокетов допустимым значениям. Если они не обновлены в пределах nfs_parse_mount_options, mount вернет неверный параметр.

Если реализация nfs_parse_mount_options гуляют через, можно видеть, что только для случая Opt_addr, адрес сервера NFS и семья сокета обновляется путем анализа опций аргумента.

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; 

Дело Opt_addr соответствует параметру "адр = Nfs сервер IP". Таким образом, для системного вызова для работы, определение этого параметра - должно. Насколько я искал, это полностью отсутствует на всех страницах руководства, в которых описывается монтирование nfs.

Так что теперь рассматривает постановку задачи, пожалуйста, попробуйте с помощью изменения в коде ниже

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

Также отметим, что, когда адр вариант ставится в аргументе, IP-адрес в передней части Путь сервера nfs становится необязательным. Однако необходимо: ':', поскольку это действует как разделитель для анализа пути сервера nfs.

+0

** Это действительно помогло .. Теперь она работает так, как ожидалось. Кажется, что страница man mount (2) нуждается в обновлении, иначе кому-то придется искать исходный код ядра так же, как и вы. Спасибо Abhijit. ** –

+0

Замечательно знать. Будет также обновлять страницу руководства – Abhijit

0

MS_MGC_VAL должны быть в верхних 16 бит, если это необходимо, а не в нижней части. Если ваша версия ядра> 2.4, вам это совсем не нужно.

+0

yes. ты прав. Я не нахожу подходящий mountflag. Пробовал пропустить 0, но немного помог. версия ядра - 2,6 –

0

Он решил следующий звонок для меня сейчас.

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

Но до сих пор ищет ответ с монтирования() вызова, как она принимает «filesystemtype» аргумент как «NFS».

Смежные вопросы