Linux, загрузка файла из другой папки, если нет в текущей

Рейтинг: 1Ответов: 1Опубликовано: 10.07.2023

Есть два примонтированных диска (например /mnt/efs1/ и /mnt/efs2/ ), один из них ro.

Скажем программа (php, go, любая другая) делает запрос на файл /mnt/efs1/f/a/cef/image.jpg

Нужно перехватить вызов, проверить существует ли файл, если его нет, то проверить этот же путь на втором диске: /mnt/efs2/f/a/cef/image.jpg, если есть - то или скопировать на диск 1, и отдать файл. Или просто вернуть файл с диска 2.

rsync запускать не вариант, обьем данных больше 5тб, и часто меняется.

Ответы

▲ 4Принят

Я бы воспользовался mergerfs

Есть overlayfs, то это монтирование на уровне ядра, а mergefs монтирует через fuse, то есть можно пользоваться без sudo

Пример.

Подготовим файлы - каталоги src1 и src2 со случайным содержимым:

target=src1; 
for i in 1 2 3; do 
  mkdir -p $target/b$i; 
  for j in `seq 9`; do 
    x=$RANDOM; 
    if [ $x -gt 16192 ]; then 
      echo $target > $target/b$i/file_$j.txt; 
    fi 
  done; 
done;
target=src2;
for i in 1 2 3; do 
  mkdir -p $target/b$i; 
  for j in `seq 9`; do 
    x=$RANDOM; 
    if [ $x -gt 16192 ]; then 
      echo $target > $target/b$i/file_$j.txt; 
    fi 
  done; 
done;

Это скрипт создаёт два каталога, в каждом три подкаталога, в каждом из подкаталогов несколько случайных файлов. Например, у меня это выглядит так:

ls -R src1/b* src2/b*
src1/b1:
file_2.txt  file_3.txt  file_4.txt  file_5.txt  file_8.txt  file_9.txt

src1/b2:
file_2.txt  file_4.txt  file_5.txt  file_6.txt  file_7.txt  file_8.txt

src1/b3:
file_2.txt  file_4.txt  file_6.txt  file_7.txt

src2/b1:
file_1.txt  file_2.txt  file_4.txt  file_7.txt  file_8.txt

src2/b2:
file_1.txt  file_3.txt  file_5.txt  file_6.txt  file_7.txt

src2/b3:
file_1.txt  file_2.txt  file_3.txt  file_6.txt  file_7.txt  file_9.txt

Теперь общий каталог

mkdir src
mergerfs ./src1:./src2 ./src

Каталог src объединяет каталоги src1 и src2

mount | grep mergerfs
1:2 on /home/user/tmp/try-mergerfs/src type fuse.mergerfs (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)

содержимое файлов:

cat src/b1/*
src2
src1
src1
src1
src1
src2
src1
src1

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