30 октября 2009 г.

Подключение сетевого диска в Ubuntu

Updated 18.12.2010

Предположим, что на компьютере с IP адресом 192.168.0.1 открыта на доступ папка linux и нам нужно подключить ее в Ubuntu, чтобы получить к ней доступ, как к любой другой папке на диске.
  • Подключение сетевого диска вручную
    После выполнения следующих команд содержимое сетевой папки //192.168.0.1/linux будет доступно пользователю в директории /media/sharename на локальном компьютере:

    sudo mkdir /media/sharename
    sudo mount //192.168.0.1/linux /media/sharename/ -o username=myusername,password=mypassword

    Почему-то у меня при попытке подключиться к расшаренным windows-папкам пришлось указывать и username и password, даже для дисков, которые расшарены для всех. Если их вообще не писать, то попытка монтировки происходила под пользователем root, и mount возвращал ошибку -13 (permission denied), а если указать только имя пользователя — высвечивал приглашение ввести пароль доступа к папке.


  • Подключение сетевого диска вручную на чтение/запись для всех пользователей

    sudo mkdir /media/sharename
    sudo mount //192.168.0.1/linux /media/sharename/ -o username=myusername,password=mypassword,dmask=777,fmask=777


  • Подключение сетевого диска на этапе загрузки через fstab

    sudo mkdir /media/sharename
    sudo cp /etc/fstab /etc/fstab_backup


    Создать файл /root/.smbcredentials и добавить следующие строки:
    username=myusername
    password=mypassword


    Сделать файл /root/.smbcredentials недоступным для пользователей, а для root -- только на чтение:
    sudo chmod 400 /root/.smbcredentials

    В файл /etc/fstab добавить следующие строки:
    //192.168.0.1/linux /media/sharename smbfs credentials=/root/.smbcredentials 0 0


    Для доступа на чтение/запись для всех:
    //192.168.0.1/linux /media/sharename smbfs credentials=/root/.smbcredentials,dmask=777,fmask=777 0 0

    На данный момент (в Ubuntu 9.10) тип smbfs устарел, поэтому нужно использовать тип cifs. Для типа cifs вместо dmask и fmask нужно указывать параметры dir_mode и file_mode, причем числовые значения этих параметров должны начинаться с нуля — "dir_mode=0777,file_mode=0777".



  • Подключение дисков из fstab без перезагрузки операционой системы
    sudo mount -a

  • Синтаксис:
    Для smbfs -- //192.168.1.1/foldername
    Для nfs -- 192.168.1.1:/foldername
Дополнения:
  1. Если подключения диска не происходит, то можно посмотреть коды возвращаемых ошибок с помощью команды dmesg, а еще лучше запустить mount с помощью утилиты strace — sudo strace mount ....

  2. Если mount возвращает ошибку (или вообще происходит нечно непонятное), то в первую очередь убедитесь, что у вас установлен mount, соответствующий типу файловой системы, которую вы хотите подключить. Например, для nfs в системе должен быть установлен mount.nfs, для smbfs — mount.smbfs, для cifs — mount.cifs и т.д. В качестве иллюстрации проблемы можно привести пример с cifs: при отсутствующем mount.cifs можно вполне успешно примонтировать cifs-диск используя параметры "username=...,password=...", но при этом попытка использования credential-файлов, будет заканчиваться ошибкой (http://ubuntuforums.org/archive/index.php/t-79612.html).

  3. Ошибка монтирования "mount error 12 = Cannot allocate memory" при попытке подключения к расшаренной папке Windows.

    Возможная причина — не хватает памяти на сервере (то есть, в Windows), а не на клиенте. В этом случае, могут помочь изменения в реестре Windows: ...\LanmanServer
    \Parameters\IRPStackSize
    (для XP, 2000, NT) или .../LanmanServer\Parameters\Size и ...\Session Manager\Memory Management\LargeSystemCache (для Windows 7).

  4. Ошибка монтирования "mount error 5 = Input/output error". В логах dmesg сообщается об ошибке "CIFS VFS: cifs_read_super: get root inode failed".

    Если при этом упоминается "Malformed FILE_UNIX_BASIC_INFO response", то возможно поможет добавление nounix в параметры вызова команды mount.

    Еще одна возможная причина — проблемы с правами доступа к расшаренной папке. У меня такая ошибка возникла, когда на папку, которую, я хотел примонтировать, в числе прочих были установлены права "Everyone - Access denied". После корректировки прав доступа всё успешно примонтировалось.

  5. Проблема монтирования CIFS диска на Ubuntu 9.10 — ресурс расшарен на другой unix-системе и успешно монтируется, но доступен только на чтение, хотя, если подключиться к этому ресурсу с помощью smbclient, то ресурс доступен и на чтение, и на запись.

    Скорее всего проблема в несовпадении uid и gid на клиенте и на сервере. Исправляется добавлением в параметры запуска команды mount значений nounix, а также uid и gid, которые соответствуют вашему пользователю на сервере — "mount //server /client -o username=someone,gid=1000,uid=1000,nounix,file_mode=0777,dir_mode=0777". (http://ubuntuforums.org/showthread.php?t=1310273)

По мотивам ubuntuguide.org, ubuntuforums.org и собственного опыта.

21 октября 2009 г.

Цитата: Саттер

...программисты, как известно, славятся тем, что очень плохо находят узкие места в своих собственных программах. Если вы не использовали профайлер и у вас нет некоторых эмпирических данных, которыми вы можете руководствоваться, вы можете потратить целые дни, оптимизируя то, что оптимизировать не требуется и что заметно не повлияет ни на размер, ни на время выполнения программы. Ситуация может оказаться хуже, когда вы не понимаете, что требует оптимизации, и своими действиями непреднамеренно ухудшаете программу.

Вот правила, которыми я призываю вас руководствоваться:
1. Не оптимизируйте преждевременно.
2. Не оптимизируйте до тех пор, пока не убедитесь в том, что это необходимо.
3. Даже в этом случае не оптимизируйте до тех пор, пока не будете точно знать, что и где надо оптимизировать.

Герб Саттер, "Решение сложных задач на C++"