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

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

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

FILESYSTEMS="hfs ufs afp"

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

2 ответа2

1

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

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .