У меня есть сервер резервного копирования, который хранит инкрементные резервные копии в виде такого дерева:
/backups
hourly.0
server 1
server 2
hourly.1
server 1
server 2
hourly.2
server 1
server 2
daily.0
server 1
server 2
etc...
Не меняя исходное дерево с фактическими резервными копиями, я хотел бы создать реорганизованное дерево, которое выглядит следующим образом:
/share
server1/1 Hour Ago -> /backups/hourly.0/server1
server1/2 Hours Ago -> /backups/hourly.1/server1
server2/1 Hour Ago -> /backups/hourly.0/server2
server2/2 Hours Ago -> /backups/hourly.1/server2
...
... а затем экспортировать это дерево как не замужем Монтирование NFS.
Клиент NFS должен увидеть:
/backups
server 1
1 Hour Ago
2 Hours Ago
server 2
1 Hour Ago
2 Hours Ago
Неудачная попытка №1 - использовать символические ссылки
Это не работает, потому что символические ссылки относятся к клиентскому компьютеру NFS, а не к серверу. При попытке открыть «1 час назад» на клиенте пытается получить доступ к /backups/hourly.0/server1 на клиент которого не существует.
Неудачная попытка №2 - Используйте BIND в / etc / fstab
то есть:
/backup/hourly.0/server1/ "/share/server1/1 Hour Ago" none ro,bind,defaults 0 0
Это позволило мне создать желаемое дерево, которое было видно на клиентах NFS, но я ничего не видел внутри папок. Вероятно, это связано с тем, что NFS не охватывает файловые системы, а NFS видит точку монтирования привязки как новую файловую систему.
Есть ли способ добиться этого?
Нет, это невозможно с одним экспортом NFS на сервере nfs на базе ядра.
Так как exports(5)
руководство говорит:
Файл / etc / exports содержит таблицу локальных физический файловые системы на сервере NFS, доступные клиентам NFS.
Однако вы можете экспортировать части дерева и собрать их на клиентах с помощью bind.
Символические ссылки
Еще одно паллиативное решение - использовать символические ссылки:
/server_1
hourly.0 -> /backups/hourly.0/server\ 1
hourly.1 -> /backups/hourly.1/server\ 1
...
/server_2
hourly.0 -> /backups/hourly.0/server\ 2
hourly.1 -> /backups/hourly.1/server\ 2
...
Чтобы это сработало, вам необходимо экспортировать все дерево резервных копий, а также каталоги сервера. Это означает, что с символическими ссылками каждый сервер будет видеть резервные копии других серверов.
вариант без скрытия
Есть nohide
и crossmount
варианты в exports
файл. Это работает только для экспорта на один сервер. Я никогда не использовал его из-за множества предупреждений, которые сопровождают этот параметр в документации, например, о возможности конфликт номеров inode.
Поскольку вы экспортируете деревья каталогов из одной и той же физической файловой системы, вы никогда не столкнетесь с этим конфликтом номеров inode или тупик, вызванный мертвым промежуточным сервером это может произойти при экспорте поддерева, смонтированного по NFS.
Я не думаю, что NFS-сервер ядра Linux сделает файловые системы, смонтированные с опцией привязки, видимой без скрытия.
Делая это наоборот
Я подумал над вопросом и понял, что, вероятно, правильный подход к этому - это сделать наоборот. То есть сделать деревья каталогов для каждого сервера так, как вы хотите, чтобы они экспортировались. Переместите данные в соответствующие места, а затем заново соберите дерево / backups с помощью mount -o bind
.
Ваша файловая система будет выглядеть так
/share/server1/1_Hour_Ago
2_Hour_Ago
...
/share/server2/1_Hour_Ago
2_Hour_Ago
...
Ваш fstab будет
/share/server1/1_Hour_Ago /backups/hourly.0/server_1 none rw,bind 0 0
/share/server1/2_Hour_Ago /backups/hourly.1/server_1 none rw,bind 0 0
...
/share/server2/1_Hour_Ago /backups/hourly.0/server_2 none rw,bind 0 0
/share/server2/2_Hour_Ago /backups/hourly.1/server_2 none rw,bind 0 0
...
Ваш exports
было бы просто
/share/server1 server1(rw,no_subtree_check)
/share/server2 server2(rw,no_subtree_check)