du считает жесткие ссылки на размер файла?

У меня есть система резервного копирования, которая создает каталоги, названные в честь временных меток Unix, а затем создает инкрементные резервные копии с использованием системы жестких ссылок (--link-dest в rsync), поэтому обычно первая резервная копия очень большая, а последующие резервные копии - дроби.

Это мой вывод моих текущих резервных копий:

root@athos:/media/awesomeness_drive# du -sh lantea_home/*
31G lantea_home/1384197192
17M lantea_home/1384205953
17M lantea_home/1384205979
17M lantea_home/1384206056
17M lantea_home/1384206195
17M lantea_home/1384207349
3.1G    lantea_home/1384207678
14M lantea_home/1384208111
14M lantea_home/1384208128
16M lantea_home/1384232401
15G lantea_home/1384275601
43M lantea_home/1384318801

Все кажется правильным, однако возьмем, к примеру, последний каталог, lantea_home/1384318801:

root@athos:/media/awesomeness_drive# du -sh lantea_home/1384318801/
28G lantea_home/1384318801/

Я постоянно получаю такое поведение, почему вторая команда du считает каталог 28G?

Примечание. Вывод остается таким же с флагами -P и -L.


person Dan LaManna    schedule 13.11.2013    source источник


Ответы (2)


Жесткие ссылки — это реальные ссылки на один и тот же файл (представленный его индексным узлом). Нет никакой разницы между «исходным» файлом и жесткой ссылкой, указывающей на него. Оба файла имеют одинаковый статус, тогда оба являются ссылками на этот файл. Удаление одного из них позволяет другому оставаться нетронутым. Только удаление последней жесткой ссылки удалит файл и освободит место на диске.

Поэтому, если вы спросите du, что он видит только в одном каталоге, ему все равно, что в другом месте есть жесткие ссылки, указывающие на то же содержимое. Он просто подсчитывает размеры всех файлов и суммирует их. Только жесткие ссылки внутри рассматриваемого каталога учитываются не более одного раза. du это умно (не все программы обязательно должны быть такими).

Таким образом, каталог A может иметь du размер 28 ГБ, каталог B может иметь размер 29 ГБ, но вместе они по-прежнему занимают только 30 ГБ, и если вы спросите du размера A и B, вы получите это число.

Использование диска несколькими каталогами при использовании жестких ссылок.

person Alfe    schedule 13.11.2013
comment
Я думаю, я не дал du достаточно кредита, я бы не подумал об этом. Спасибо! - person Dan LaManna; 13.11.2013
comment
А так как du считает только первую жесткую ссылку на тот же индексный дескриптор, с которым он сталкивается, мне нравится давать ему каталоги подряд: $ du -hc --max-depth=0 dirA dirB 29G /dirA 1G /dirB 30G total - person tuk0z; 24.02.2015

А с помощью переключателя "-l" du также считает жесткие ссылки в каждом подкаталоге, поэтому я могу видеть, насколько велика вся резервная копия, а не только дельта приращения.

person Tobias    schedule 05.06.2014
comment
Небольшое дополнительное объяснение может помочь коллегам-программистам понять, как это работает. - person Nagama Inamdar; 05.06.2014
comment
Это настоящий ответ - person Max Cuttins; 24.01.2018