Можно ли создать базу данных locate для сетевого тома в Mac OS X?

684
tom stratton

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

Вместо того, чтобы «катиться самостоятельно», кажется разумным использовать locateили mlocateсоздать базу данных, но я не смог получить locateили mlocateработать на томе, подключенном к сети AFP (или SMB в этом отношении).

У кого-нибудь есть предложение? Я изменил locate.rcфайл во всех комбинациях, которые мог придумать, но я подозреваю, что ни один AFP ro SMB не приемлем для линии FILESYSTEMS.

FILESYSTEMS="hfs ufs afp" 

Я попробовал NFS, но у меня нет доступа к серверу, чтобы настроить его на прием подключений от Mac (кажется, вам нужно установить «небезопасный» в качестве одного из параметров для домена).

0
Вы рассматривали возможность использования `mdfind` (т.е. Spotlight) вместо этого? Asmus 9 лет назад 0

2 ответа на вопрос

1
keen

Оказывается, можно сделать так, чтобы 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.

У меня не было времени, чтобы проверить это, но прочитать его кажется лучшим решением, поэтому я приму это. FWIW, чтобы решить мою проблему, я установил mlocate непосредственно на сервере NAS, а затем выставил базу данных на общем томе, что позволило напрямую выполнить ее поиск. tom stratton 9 лет назад 0
ха, хороший трюк! На данный момент я пошел по маршруту run-root-root .... конечно, с 6T для индексации между nfs и afp mounts, это заняло некоторое время! другой путь - смонтировать их дважды - один раз nfs для locate, и один раз afp для osx-friendlyity, я полагаю. keen 9 лет назад 0
0
AbsoluteƵERØ

Поэтому, если вы пытаетесь найти миллионы файлов, вы, вероятно, захотите использовать что-то вроде 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, вы все равно можете извлечь все файлы, к которым у вас есть доступ. Опять же вам понадобится столько же места, сколько и файлов, которые вы добываете.

команда find не является быстрой и это именно та команда, которую я стараюсь избегать ... grep обрабатывает содержимое файла, а не имена файлов. Можно перенаправить команду ls в grep и выполнить поиск таким образом, но вы по-прежнему обрабатываете имена файлов со скоростью сетевого соединения. Весь смысл в попытках получить базу данных locate состоит в том, чтобы избежать точного решения, которое вы предлагаете - я что-то упустил? tom stratton 11 лет назад 0