LINUX.ORG.RU

rmlint - помогите осилить

 ,


2

2

Здравствуйте! Я - dk-, и я идиот.

Начало было тут: Сервер на убунте: правильно разбить диск и фс для дедупликации

Кратко суть:
Есть очень большие (десятки и сотни гигапикселей) фотопанорамы. Реальной картинки там сектор (скажем 200х50 градусов), остальное же - черные квадраты. Сферическая разверстка, полная сфера (на самом деле куб) только. Это жрет место на хостинге. Много. Мне ссд на 250гб не хватает. Все эти черные файлики абсолютно одинаковые. Хочется оставить один, а остальные симлинком.

Хороший человек посоветовал мне rmlint.

Я даже осилил собрать ее из исходников и запустить. И она даже удалила реально дубли. Правда очень странно (но сейчас не буду это описывать).

Гляжу в книгу, вижу фигу: https://rmlint.readthedocs.io/en/latest/tutorial.html#replaying-results

Вопрос:
Что мне «скопировать в терминал» %) чтоб получить искомый результат - идентичные файлы удаляются все кроме одного, остальные - симлинками.



Последнее исправление: dk- (всего исправлений: 1)
Ответ на: комментарий от Harald

Ну они генерируются софтиной - просто черный квадрат 512рх. Размер в байтах одинаковый. Хеш не считал, но не вижу причин быть им разными.

dk-
() автор топика

у rmlint есть же гуй, там можно всё настроить или после поиска указать что удалять, а что не удалять.

Deleted
()
Ответ на: комментарий от Deleted

нет иксов - нет гуя :)
сервер железный под хостинг сайта.

удалить надо все. но заменив симлинками.

dk-
() автор топика
Ответ на: комментарий от Deleted

http://rmlint.readthedocs.io/en/latest/tutorial.html#outputs-formatters

Да я это видел. Не осилил.
Я как понял:
- после сканирования она генерит скрипт
- скрипт можно править
- по дефолту скрипт на удаление
- в нем надо произвести замену указав хардлинк.

Так?
Вот последний пункт туплю.

dk-
() автор топика
Ответ на: комментарий от dk-

Как бы логично было запускать сразу командой «дубли на хардлинки», без правок конфигов и т.п.

localhostroot@sd-73786:~$ rmlint --help
Usage:
  rmlint [OPTION...] [TARGET_DIR_OR_FILES ?] [//] [TAGGED_TARGET_DIR_OR_FILES ?] [-]

rmlint finds space waste and other broken things on your filesystem and offers to remove it.
It is especially good at finding duplicates and offers a big variety of options to handle them.

Help Options:
  -h, --help                           Show help options
  --help-all                           Show all help options

Application Options:
  -d, --max-depth=N                    Specify max traversal depth
  -S, --rank-by=[dlamprxDLAMPRX]       Select originals by given  criteria
  -y, --sort-by=[moansMOANS]           Sort rmlint output by given criteria
  -T, --types=T                        Specify lint types
  -s, --size=m-M                       Specify size limits
  -a, --algorithm=A                    Choose hash algorithm
  -o, --output=FMT[:PATH]              Add output (override default)
  -O, --add-output=FMT[:PATH]          Add output (add to defaults)
  -n, --newer-than-stamp=PATH          Newer than stamp file
  -N, --newer-than=STAMP               Newer than timestamp
  -Y, --replay=path/to/rmlint.json     Re-output a json file
  -c, --config=FMT:K[=V]               Configure a formatter
  -g, --progress                       Enable progressbar
  -v, --loud                           Be more verbose (-vvv for much more)
  -V, --quiet                          Be less verbose (-VVV for much less)
  -W, --no-with-color                  Be not that colorful
  -r, --hidden                         Find hidden files
  -f, --followlinks                    Follow symlinks
  -F, --no-followlinks                 Ignore symlinks
  -p, --paranoid                       Use more paranoid hashing
  -x, --no-crossdev                    Do not cross mounpoints
  -k, --keep-all-tagged                Keep all tagged files
  -K, --keep-all-untagged              Keep all untagged files
  -m, --must-match-tagged              Must have twin in tagged dir
  -M, --must-match-untagged            Must have twin in untagged dir
  -b, --match-basename                 Only find twins with same basename
  -e, --match-extension                Only find twins with same extension
  -i, --match-without-extension        Only find twins with same basename minus extension
  -D, --merge-directories              Find duplicate directories
  -z, --perms=[RWX]+                   Only use files with certain permissions
  -L, --no-hardlinked                  Ignore hardlink twins
  --partial-hidden                     Find hidden files in duplicate folders only
  -H, --show-man                       Show the manpage
  --version                            Show the version & features
  --gui                                If installed, start the optional gui with all following args
  --hash                               Work like sha1sum for a


как-то не вижу тут такого.

dk-
() автор топика

Гляжу в книгу, вижу фигу: https://rmlint.readthedocs.io/en/latest/tutorial.html

Там же пример есть готовый.

Вот эта команда сгенерирует шел-скрипт, который сделает все дубли символьными ссылками на оригинал. Скрипт будет выведен на экран и копия скрипта уйдёт в rmlint.sh.

rmlint -o sh:stdout -o sh:rmlint.sh -c sh:symlink

Ну и запуск скрипта сделает всю грязную работу:

./rmlint.sh -d

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Хм. Счастье стало ближе?

А как указать, чтоб ничего не выводило (там, мать его, миллионы файлов), а сразу исполнялось?

dk-
() автор топика

хз насчёт rmlint, не пользовал, ибо есть fdupes:

https://github.com/jobermayr/fdupes/tree/opensuse

можно качнуть rpm-ку готовую из любого репо. понимает рекурсию, можно натравить куда угодно и указать soft или hard линки хочешь вместо дублей. этот пакет пользует макрос rpm для поиска дублей при сборке.

anonymous
()
Ответ на: комментарий от dk-

А как указать, чтоб ничего не выводило (там, мать его, миллионы файлов), а сразу исполнялось?

Чтобы не выводилось, не нужно просить вывода:

rmlint -o sh:rmlint.sh -c sh:symlink

Но запускать скрипт всё равно нужно руками. Судя по докам, у rmlint такая политика — сама утилита ничего менять не будет.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Сегодня еще раз порепетирую на виртуалке.

dk-
() автор топика
Ответ на: комментарий от i-rinat

Кажется что-то пошло не так.
Скрипт долго анализирует, потом, после запуска, долго удаляет и делает симлинки. Но вот места свободного не добавляется :)

dk-
() автор топика
Ответ на: комментарий от dk-

Выложи что-ли ссылку на архив с одной панорамой из тех что ты хочешь зачистить от дубликатов, а то может твои одинаковые черные файлы совсем не такие одинаковые как ты о них думаешь.

o-
()
Ответ на: комментарий от dk-

А ты уверен, что оно таки делает симлинки?

И возможно, у тебя эти файлы были открыты, поэтому их удаление не освободит места, пока приложение файлы не закроет.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Ну приложения как такового нет. Максимум доступа к файлам - это их тупо чтение вебсервером.

Symlinking to original: /home/localhostroot/magas-2016/panos/01.tiles/d/l02/3/l02_d_3_3.jpg
Symlinking to original: /home/localhostroot/magas-2016/panos/01.tiles/d/l02/3/l02_d_3_2.jpg
Symlinking to original: /home/localhostroot/magas-2016/panos/01.tiles/d/l02/3/l02_d_3_1.jpg
Symlinking to original: /home/localhostroot/magas-2016/panos/01.tiles/b/l01/1/l01_b_1_1.jpg
Symlinking to original: /home/localhostroot/magas-2016/panos/01.tiles/u/l01/1/l01_u_1_1.jpg
Deleting script ./rmlint.sh
localhostroot@sd-73786:~/magas-2016$ df -h

Ну весь лог был загажен таким. Судя по времени исполнения (довольно большому) оно по всем прошлось.

Может ли df -h неадекватно учитывать свободное место? Типа все симлинки считать реальными файлами?

o-, ага, пасиба, выложу пример позже. Ну вообще это квадрат с абсолютно черным содержимым размером 512рх и все файлы имеет одинаковый размер в байтах. Как-то маловероятно, что они «разные». Они же генерируются по одному алгоритму, а не получаются «обработкой» какого либо изображения.

dk-
() автор топика
Ответ на: комментарий от dk-

/home/localhostroot/magas-2016/panos/01.tiles/u/l01/1/l01_u_1_1.jpg

И тут до меня дошло. У тебя ведь файловая система ext4? Если да, то только символьная ссылка длиной не более 60 байт хранятся внутри inode. Если rmlint делает символьные ссылки по полным путям, а не по относительным, пути будут по 67 байт, поэтому в inode они не влазят, и для них выделяется блок на диске, то есть 4096 байт. Если твои файлы были меньше 4096 байт, выигрыша в занимаемом месте не будет.

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

i-rinat ★★★★★
()
Ответ на: комментарий от dk-

Нагуглил утилиту symlinks, которая делает из абсолютных путей в символьных ссылках относительные. Она, скорее всего, уже есть в репозитории собранная. Тебе понадобится зайти в ту директорию, где картинки лежат, и запустить:

symlinks -csr .

Эта команда пройдёт по всем поддиректориям от текущей и сократит длины ссылок.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Эта команда пройдёт по всем поддиректориям от текущей и сократит длины ссылок.

Не понял.

dk-
() автор топика
Ответ на: комментарий от dk-

Например полный путь /home/vasyapupkin/.../1/black-image.png если дубль лежит рядом например /home/vasyapupkin/.../2/black-image.png то относительный пусть из /home/vasyapupkin/.../2/ до него будет ../1/black-image.png.

ya-betmen ★★★★★
()
Ответ на: комментарий от dk-

i-rinat же описал, в некоторых случаях твой хардлинк будет места занимать не меньше чем сам файл. Если путь длиннее 67 байт (для утф это 33 символа) а размер файла меньше 4кб то это будет тот самый случай.

ya-betmen ★★★★★
()
Последнее исправление: ya-betmen (всего исправлений: 1)
Ответ на: комментарий от ya-betmen

уловил. вроде для теста на малом каталоге все сделал. в т.ч. ссылки сократил.

а как можно посмотреть размер каталога? и будет ли корректно учтена «эконосия» на этом шаманстве?

хочу сравить обработанный каталог и его исходную копию.

dk-
() автор топика
Ответ на: комментарий от ya-betmen

du -h <имя-директории>

Вроде работает!
Экономия на этом примере вышла небольшая, но вышла. Теперь проверю на паре десятков гб.

Вроде решение рабочее найдено.

Всем спасибо!

dk-
() автор топика
Ответ на: комментарий от ya-betmen

В том то и дело. У меня задача в свободные на ссд 220гб все запихать :)

Еще вопрос:
Я правильно помню, что для отдачи статики лучше нджинск, а не апач?

dk-
() автор топика
Ответ на: комментарий от dk-

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

ya-betmen ★★★★★
()
Ответ на: комментарий от ya-betmen

хардлинк

Кстати, вот хардлинк может и меньше места, чем симлинк занять. Места в каталоге он займёт столько же, но ему совсем не нужно тела, вне зависимости от длины пути. Там же просто число.

i-rinat ★★★★★
()
Ответ на: комментарий от dk-

симлинк на хардлинк?

Моя твоя не понимат.

Если ты имеешь в виду заменить в команде symlink на hardlink, то это скорее всего сработает. Но я бы сделал бекап.

С хардлинками есть особенности. Они работают только внутри одной файловой системы. Их число ограничено, где-то в районе 65000 для ext4. Симлинки — просто особые текстовые файлы, поэтому не ограничены одной ФС. И число тоже не ограничено.

Я не знаю, как будет rmlint поступать, когда до лимита дойдёт, если дойдёт. Будет ли он ошибки проверять, и всё такое. С симлинками в этом плане безопаснее, без лимитов.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от i-rinat

ФС одна, а вот 65к - очень мало. значит симлинки оставлю.

dk-
() автор топика

Вообще мало сэкономило.

Сейчас проверил на в меру большой панораме. 2 вида (сцены), в каждой реальная картинка занимает менее 1\3 площади. До этих шаманств было 31гб, после (rmlint , плюс symlinks) стало 25гб. -20% это, конечно, сильно лучше, чем ничего. Но явно мало.

Куда еще можно копнуть?

changed:  /www/magas/panos/02.tiles/b/l07/29/l07_b_29_79.jpg -> ../../../l/l09/1/l09_l_1_98.jpg
absolute: /www/magas/panos/02.tiles/vr/pano_u.jpg -> /www/magas/panos/02.tiles/vr/pano_b.jpg
changed:  /www/magas/panos/02.tiles/vr/pano_u.jpg -> pano_b.jpg


На путях еще можно что-то сэкономить?

dk-
() автор топика
Ответ на: комментарий от anonymous

А я помню. Но разве это что-то принципиально изменит? Будут те же симлинки, которые сами по себе жрут место.

dk-
() автор топика
Ответ на: комментарий от dk-

Но разве это что-то принципиально изменит?

fdupes -l sym -r ${path}
vs
fdupes -l hard -R ${path}

какие ещё принципы/варианты? разве что загнать в postgres и выдавать в соответствии с запросом..

anonymous
()
Ответ на: комментарий от anonymous

Выше писали, что хардлинков нельзя больше 65к штук. А это не вариант. Речь о миллионах дублей.

В базу загонять миллионы файлов еще больший бред, имхо :)

Сейчас заливаю огромный тестовый архив. Посмотрю как на нем будет. 20% или больше\меньше разница.

dk-
() автор топика
Ответ на: комментарий от dk-

Речь о миллионах дублей. В базу загонять миллионы файлов еще больший бред, имхо :)

бурные аплодисменты, переходящие в овации.. как бэ базы спецом пилят ради вот этих ваших мильёнов. у любой базы - свои оверхэды, ессно. вопрос лишь в целесообразности. ну и генерировать «дубли» база может сама по запросу к файлу, если эта операция хоть как-то формализована.

плюс надо луркать вопросы бэкапа и репликации..

anonymous
()
Ответ на: комментарий от dk-

Всё ещё можно иметь один файл, 64999 хардлинков на него, потом второй такой же файл, 64999 хардлинков уже на него, и так далее. Вопрос только в том, умный ли rmlint настолько, чтобы так суметь.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Щас как раз на сервере клонирую каталог большой. чтоб разные извраты проверить.

dk-
() автор топика
Ответ на: комментарий от i-rinat

Что самое страшное можно случиться при переборе числа хардлинков? У меня всю ФС не распидорасит?)

dk-
() автор топика
Ответ на: комментарий от dk-

С ФС всё будет в порядке, там куча проверок внутри. Просто вызов ln existing_name new_name может вернуть ошибку и нового имени не будет создано.

Если попытаться создать новое имя в то время, как такое имя уже есть у другого файла, ядро вернёт ошибку. Поэтому старый файл нужно сначала удалить, а уже потом создавать ссылку с тем же именем. Теперь представь себе, что число ссылок стало максимальное. Старый файл удаляется, а ссылку создать не получается. Выглядит так, будто файл пропал без следа.

i-rinat ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.