Вопрос или проблема
У меня возникла проблема с файлом экспорта NFS.
Конкретно, я не могу найти способ экспортировать каталог, содержащий “-” в имени пути.
В руководстве (exports(5)) говорится:
Кроме того, каждая строка может иметь одно или несколько указаний для параметров по умолчанию
после имени пути в виде дефиса ("-"), за которым следует список параметров.
Список параметров используется только для всех последующих экспортов в этой строке.
Далее говорится:
Если имя экспорта содержит пробелы, его следует заключить в двойные кавычки.
Вы также можете указать пробелы или другие необычные символы в имени экспорта,
используя обратный слеш, за которым следует код символа в виде трех восьмеричных цифр.
К сожалению, это не так. Конкретно, если имя пути содержит “-“, будь то в прямом виде или с \055, или оно заключено в двойные кавычки, оно все равно ссылается на имя без “-”
Есть идеи? У меня есть большое количество каталогов, все из которых имеют следующий вид:
- /vol/buildsystem-s3c2440
- /vol/buildsystem-tao3530
Я предпочел бы, чтобы все они были доступны в качестве NFS-экспорта. За исключением замены “-” на “_” во всех скриптах, можно ли это сделать с “-“?
Исходя из этого текста, я предполагаю, что вы на Linux?
Если имя экспорта содержит пробелы, его следует заключить в двойные кавычки.
Вы также можете указать пробелы или другие необычные символы в имени экспорта,
используя обратный слеш, за которым следует код символа в виде трех восьмеричных цифр.
Существуют две разные реализации NFS-сервера в системах Linux:
- пользовательский NFS
- ядерный NFS
Пожалуйста, попробуйте выполнить ps -ef | grep nfsd
, чтобы увидеть, какая из них у вас.
Я думаю, что пользовательский NFS будет отображаться как nfsd
или unfsd
, а ядерный NFS будет отображаться как [nfsd]
.
(Обратите внимание, как один имеет квадратные скобки, а другой – нет.)
С ядерным NFS вам следует использовать двойные кавычки или восьмеричные экранирования, например:
"/path/to/mount-point" <options>
или
/path/to/mount\055point <options>
(Справка: nfs-utils-1.1.2, xgettok
в support/nfs/xio.c
)
С пользовательским NFS пробелы не допускаются в именах экспорта, но знак минус (-
) не должен требовать экранирования, например:
/path/to/mount-point <options>
(Справка: nfs-user-server-2.2beta47, filt_getc
в auth_init.c
)
Если вы не можете разобраться в этом, я бы предложил переключиться с пользовательского NFS на ядерный NFS, чтобы вы могли использовать кавычки или восьмеричные экранирования.
На Debian и Ubuntu:
apt-get install kernel-nfs-server
На Red Hat и Fedora:
yum install nfs-utils
Это немного хакерский подход, но вы можете создать привязанные монтирования для каждого из каталогов и экспортировать их назначения. Что-то вроде:
mount -o bind /vol/buildsystem-s3c2440 /vol/buildsystems3c2440
mount -o bind /vol/buildsystem-tao3530 /vol/buildsystemtao3530
Я не уверен, повлияет ли наличие большого количества монтирований на скорость доступа к файлам.
Работает ли экранирование с помощью обратного слеша?
- /vol/buildsystem\-s3c2440
- /vol/buildsystem\-tao3530
Вы пробовали просто экранировать с помощью \-
? Я не эксперт по NFS, но это стоит попробовать. Это работает во многих других ситуациях…
Хорошо, может быть, еще одно обходное решение. Это немного неудобно, но почему бы не создать каталог, содержащий символические ссылки на все предыдущие каталоги (можно использовать скрипт или цикл while для этого). Если имена символических ссылок не содержат никаких дефисов, вы должны быть в состоянии их экспортировать. Таким образом, как вы и хотели, вам не нужно будет изменять имена ваших реальных каталогов.
Я не уверен, сработает ли это, но, вероятно, стоит попробовать, не так ли?
Мой опыт с nfs4 таков, что он не позволяет экспортировать символические ссылки, как это делал nfs3.
Ответ или решение
Вопрос о том, как экспортировать NFS пути, содержащие дефисы ("-"), действительно может представлять собой проблему. Давайте рассмотрим несколько решений и альтернатив, которые вы можете рассмотреть.
1. Проверка используемого NFS
Первым делом, проверьте, какой именно сервер NFS установлен на вашей системе. Это можно сделать с помощью команды:
ps -ef | grep nfsd
В зависимости от результата вы сможете понять, используете ли вы пользовательский (user NFS) или ядерный NFS (kernel NFS):
- Ядерный NFS будет отображаться как
[nfsd]
- Пользовательский NFS будет отображаться как
nfsd
илиunfsd
2. Обработайте НФС в зависимости от сервера
Ядерный NFS
Если вы используете ядерный NFS, то вы можете попробовать следующие варианты:
- Использование двойных кавычек:
"/vol/buildsystem-s3c2440" <опции>
- Использование восьмеричного экранирования:
/vol/buildsystem\055s3c2440 <опции>
Пользовательский NFS
Если вы используете пользовательский NFS, то, как правило, дефисы не должны представлять проблему, и вы можете экспортировать их напрямую:
/vol/buildsystem-s3c2440 <опции>
3. Работы с монтированием
Если указанные методы не работают, вы можете рассмотреть возможность создания монтированных точек для каждого каталога без дефисов. Это можно сделать с помощью команды mount --bind
. Например:
mount -o bind /vol/buildsystem-s3c2440 /vol/buildsystems3c2440
mount -o bind /vol/buildsystem-tao3530 /vol/buildsystemtao3530
После этого вы сможете экспортировать монтированные директории, если они не содержат дефисов.
4. Использование символических ссылок
Хотя ваше мнение о том, что NFSv4 не позволяет экспортировать символические ссылки, верно, создайте директорию с символическими ссылками на изначальные директории, но имейте в виду, что NFSv4 имеет ограничения в этом плане:
- Создайте новую директорию:
mkdir /vol/symlink_dir
- Создайте символические ссылки:
ln -s /vol/buildsystem-s3c2440 /vol/symlink_dir/buildsystems3c2440
ln -s /vol/buildsystem-tao3530 /vol/symlink_dir/buildsystemtao3530
К сожалению, будете ли вы в состоянии экспортировать эти символические ссылки, зависит от версии NFS. Лучше проверить документацию.
5. Замена названий
Если ни один из вышеуказанных методов не подходит, возможно, стоит рассмотреть возможность изменения названий ваших каталогов на уровне файловой системы (например, замена дефиса на нижнее подчеркивание), но я понимаю, что это может быть обременительно.
В заключение, существует несколько решений для успешного экспорта директорий с дефисами в пути NFS. Надеюсь, одно из предложенных решений подойдет для вашего избранного сценария.