Назад | Перейти на главную страницу

Как мне организовать файловое дерево, а затем экспортировать его через NFS?

У меня есть сервер резервного копирования, который хранит инкрементные резервные копии в виде такого дерева:

/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)