Слить кучу каталогов в один через UnionFS

Проблемы установки, настройки и работы Правильной Операционной Системы

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
Dorlas
сержант
Сообщения: 257
Зарегистрирован: 2008-07-18 22:17:49

Слить кучу каталогов в один через UnionFS

Непрочитанное сообщение Dorlas » 2008-11-16 12:58:59

Всем добрый день!

Пытаюсь решить задачку - есть затыки:

Условия:
У меня есть домашний сервер, который в моем городе предоставляет зеркало distfiles для FreeBSD (FTP и Rsync)

Задача:
Хочется эти же distfiles предоставить друзьям Gentoo-шникам.

Особенности:
В структуре каталогов - у проекта Gentoo репозитории по принципу одной кучи - все файлы в одном каталоге.
У FreeBSD - некая иерархия каталогов (я насчитал 712 вместе с подкаталогами).

Проблема:
Погуглив по инету я понял, что unionfs - наше все и сваял такой вот скрипт:

Код: Выделить всё

#!/usr/local/bin/perl

@catalogs = `find /mnt/progs/ftp.freebsd.org/pub/FreeBSD/ports/distfiles/ -type d -print`;
shift(@catalogs);

#for($i=0;$i<=$#catalogs;$i++) {
for($i=0;$i<=3;$i++) {
$temp = $catalogs[$i];
chomp($temp);
`mount_unionfs -o below $temp /backup/jail/ftp/var/ftp/pub/Gentoo/distfiles/`;
}
Проблема в том, что при выполнении скрипта со всем списком - ядро падает в kernel panic. Если же поставить маленькое значение - например 3 (см. скрипт) - тогда все пучком - каталоги монтируются друг в друга, желаемый эффект достигается.

Нужны умные мысли, что не так :)

Буду также раз другим предложениям - как решить такую задачку (без дубляжа информации).

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Слить кучу каталогов в один через UnionFS

Непрочитанное сообщение zg » 2008-11-16 15:07:43

симлинки делай на файлы в подкаталогах

Аватара пользователя
Dorlas
сержант
Сообщения: 257
Зарегистрирован: 2008-07-18 22:17:49

Re: Слить кучу каталогов в один через UnionFS

Непрочитанное сообщение Dorlas » 2008-11-16 16:02:14

симлинки делай на файлы в подкаталогах
Мягкие или жесткие?

Мягкие делал - полный отстой (система потом перемантируется в другое назначение - в jail.

Да и как обновлять потом?

Аватара пользователя
Dorlas
сержант
Сообщения: 257
Зарегистрирован: 2008-07-18 22:17:49

Re: Слить кучу каталогов в один через UnionFS

Непрочитанное сообщение Dorlas » 2008-11-16 18:27:14

В общем в неком виде вроде решил :)

На том же разделе, где находится репозиторий для FreeBSD, создается каталог:
/mnt/progs/gentoo/

В него скриптом создаются hard-линки с файлов, содержащихся в каталогах и подкаталогах (кроме корня):

Код: Выделить всё

#!/usr/local/bin/perl

@catalogs = `find /mnt/progs/ftp.freebsd.org/pub/FreeBSD/ports/distfiles/ -type d -print`;
shift(@catalogs);

for($i=0;$i<=$#catalogs;$i++) {
$temp = $catalogs[$i];
chomp($temp);
@find = `find $temp -type f -print`;
for($j=0;$j<=$#find;$j++) {
@filename = split(/\//, $find[$j]);
$myfilename = $filename[$#filename];
chomp($myfilename);
$linkfile = "/mnt/progs/gentoo/".$myfilename;
chomp($linkfile);
chomp($find[$j]);
`ln $find[$j] $linkfile`;
        }
}
После отработки скрипта (на моей системе он работал минут 5-7), выполняем следующий финт ушами:

Код: Выделить всё

mount_unionfs -o below /mnt/progs/ftp.freebsd.org/pub/FreeBSD/ports/distfiles/ /backup/jail/ftp/var/ftp/pub/Gentoo/distfiles/
mount_unionfs -o below /mnt/progs/gentoo/ /backup/jail/ftp/var/ftp/pub/Gentoo/distfiles/
Сравнивал содержимое FTP-папок (du -k -d 0) - вроде похоже на правду:)

PS: Все равно метод с симлинками мне не нравится - вот пройдет ночное обновление - что опять, запускать мой тупой скрипт? :) :evil:

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Слить кучу каталогов в один через UnionFS

Непрочитанное сообщение zg » 2008-11-16 19:43:16

Dorlas писал(а):PS: Все равно метод с симлинками мне не нравится - вот пройдет ночное обновление - что опять, запускать мой тупой скрипт?
-)) что больше не нравится? что тупой, или что запускать?

запускать и крон умеет. А что скрипт тупой, дык кто виноват? :roll:

Тут на самом деле всё просто - по крону обновляешь симлинки, скрипт работает в два этапа:
1. удаление ссылок из корня диста
2. создание ссылок

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

Аватара пользователя
Dorlas
сержант
Сообщения: 257
Зарегистрирован: 2008-07-18 22:17:49

Re: Слить кучу каталогов в один через UnionFS

Непрочитанное сообщение Dorlas » 2008-11-16 20:03:52

Не нравится - потому что решения такого рода - костыль и нарушение красоты :) :st:

Хочется проще сделать, тем более без скриптов по Cron-у.

Просто похоже пока развитие unionfs не на том уровне, чтобы такие вот извращенные задачи решать влет.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Слить кучу каталогов в один через UnionFS

Непрочитанное сообщение zg » 2008-11-16 20:37:32

Dorlas писал(а):Просто похоже пока развитие unionfs не на том уровне, чтобы такие вот извращенные задачи решать влет.
тебе виднее :smile:
Dorlas писал(а):Не нравится - потому что решения такого рода - костыль и нарушение красоты
ну да, кернел паник гораздо эстетичней ;-) unionfs работает на уровне ядра (как и любой mount) и грузит его не по детски, ссылки же на уровне файловой системы и ничего не грузят.

Хочешь костылей - монтируй папки сотнями, хочешь нормальное решение - делай на ссылках, они как бы для этого и задумывались :pardon: