Можно ли создать базу данных locate для сетевого тома в Mac OS X?
Мне нужно иметь возможность быстро искать среди миллионов файлов на сетевом томе, и вместо прямого поиска я бы хотел посмотреть информацию в базе данных.
Вместо того, чтобы "кататься", кажется разумным использовать locate
или же mlocate
построить базу данных, но я не смог получить locate
или же mlocate
работать на томе, подключенном к сети AFP (или SMB в этом отношении).
У кого-нибудь есть предложение? Я изменил locate.rc
файл во всех комбинациях, которые я мог придумать, но я подозреваю, что ни AFP ro SMB не приемлемы для линии FILESYSTEMS.
FILESYSTEMS="hfs ufs afp"
Я пробовал NFS, но у меня нет доступа к серверу, чтобы настроить его на прием подключений от Mac (кажется, вам нужно установить "небезопасный" в качестве одного из параметров для домена).
2 ответа
Оказывается, можно сделать так, чтобы locate.updatedb индексировал другие файловые системы, в том числе подключенные к сети.
Подвох заключается в том, что корень файловой системы (и дерево вплоть до содержимого, которое вы хотите проиндексировать) должен быть доступен для чтения пользователю / группе "nobody".
Вы были на правильном пути с /etc/locate.rc
После этого я обнаружил, что /usr/libexec/locate.updatedb просто использует find для построения индекса.
Он просматривает записи в /etc/locate.rc FILESYSTEMS (по крайней мере, на 10.6, по умолчанию это просто hfs, если не установлено).
Страница man find предлагает использовать "sysctl vfs", чтобы узнать, что действительно на вашем компьютере. В моем случае:
sysctl vfs|grep mounted
vfs.nfs has 1 mounted instance
vfs.hfs has 3 mounted instances
vfs.autofs has 3 mounted instances
vfs.afpfs has 4 mounted instances
Некоторое быстрое тестирование, чтобы проверить это:
prowler:~%% mount |grep Volumes/keen
afp_1I6KyU4igzg00Q0vsj4E2G0H-1.2f0004fb on /Volumes/keen (afpfs, nodev, nosuid, mounted by keen)
prowler:~%% touch /Volumes/keen/test-afpfs
prowler:~%% find /Volumes/keen/ -name test-afpfs -fstype afpfs
prowler:~%% find /Volumes/keen/test-afpfs -name test-afpfs -fstype afpfs
/Volumes/keen/test-afpfs
prowler:~%% find /Volumes/keen/test-afpfs -name test-afpfs -fstype hfs
prowler:~%%
По крайней мере, для 10.6 afpfs является правильным для файловой системы, смонтированной AFP.
Теперь к провалу для afpfs.
Когда OSX (10.6) монтирует том AFP (монтируется через элемент входа в систему или Finder -> Go -> connect to server - традиционные механизмы OSX для AFP), он монтирует его как читаемый только пользователем:
prowler:/Volumes/keen%% ls -ld /Volumes/keen
drwx------ 6 keen keen 264 Dec 13 12:45 /Volumes/keen/
и попытка исправить это вручную:
prowler:/Volumes/keen%% sudo chmod a+rx /Volumes/keen
prowler:/Volumes/keen%% ls -ld /Volumes/keen
drwx------ 6 keen keen 264 Dec 13 12:52 /Volumes/keen/
Я еще не нашел обходного пути (я не пробовал autofs, так как этот метод имеет тенденцию ломаться в каждой версии OSX...).
Тома hfs (и предположительно hfs+ и т. д.), которые монтируются, не имеют этой проблемы, как и тома NFS, смонтированные с помощью Дисковой утилиты -> Монтирование NFS (10.6).
prowler:~%% mount |grep nfs
murf:/backups on /Users/keen/backups (nfs, nodev, nosuid, automounted, nobrowse)
prowler:~%% ls -ld /Users/keen/backups
drwxrwxrwx 33 root wheel 2048 Dec 13 03:05 /Users/keen/backups/
Я обнаружил это при попытке проверить индексацию местоположения только при монтировании afp:
prowler:/Volumes/keen%% grep FILESYSTE /etc/locate.rc
FILESYSTEMS="afpfs"
prowler:/Volumes/keen%% sudo /usr/libexec/locate.updatedbshell-init: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
shell-init: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
shell-init: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
find: .: Permission denied
При запуске с $PWD вне монтирования afp этой ошибки не было:
prowler:~%% sudo /usr/libexec/locate.updatedb
prowler:~%%
но также не было никаких результатов:
prowler:~%% locate test-afpfs
prowler:~%%
Итак, короткий ответ, который я нашел, - ДА! Вы можете найти, чтобы индексировать сетевые тома на OSX. НЕТ, вы не можете индексировать сетевой том afp.
Поэтому, если вы пытаетесь найти миллионы файлов, вы, вероятно, захотите использовать что-то вроде grep через командную строку. Вы получите доступ к общему ресурсу через /volume /sharename (при условии, что вы подключились через SMB или AFP).
#Print the files to screen:
grep -rI 'textstring' /Volumes/sharename/folder/
#capture the search in a file:
grep -rI 'textstring' /Volumes/sharename/folder/ > ~/desktop/searchResults.txt
* Это может быть довольно большим, если у вас очень слабый поиск, поскольку он будет захватывать все файлы, которые соответствуют.
Если вы просто пытаетесь найти файл, вы можете искать вот так
#display the results onscreen for a file ending in 'txt'
find /Volumes/sharename/folder -name '*txt'
#capture the results in a file on your desktop.
find /Volumes/sharename/folder -name '*txt' > ~/desktop/findResults.txt
* Это может также стать довольно большим, если у вас очень слабый поиск, поскольку он будет захватывать все файлы, которые соответствуют.
Вы можете использовать базу данных для хранения всех файлов, но база данных будет соответствовать размеру системы, в которой они хранятся, и при этом вы будете реплицировать функциональность самой файловой системы.
Альтернативой может быть поиск в локальном наборе файлов, созданных с помощью rsync. Если на хост-компьютере нет демона rsync, вы все равно можете извлечь все файлы, к которым у вас есть доступ. Опять же, вам нужно столько же места, сколько и файлов, которые вы добываете.