LINUX.ORG.RU

Sparse file qcow2 разный размер

 , ,


0

2

Имеется несколько виртуальных дисков в формате qcow2, с максимальным размером в 100G. Понятно, что это спарс файлы, которые команда ls видит совершенно по идиотски, как если бы они в самом деле занимали 100G.

qemu-img info

du

Эти чудесные команды показывают занимаемый на самом деле размер 4G.

Проблема в следующем. Я копирую файл, который как бы 100G, по факту 4G, на другой физический диск, где свободного места 20G и …*опа. Файловые менеджеры, например double-commander показывают, что на диске осталось 0 места. Это ну охренеть как неудобно!

Теперь, если я делаю клон диска qcow2, то получаю диск, который команда ls -l видит как 4G, а qemu-img видит и как 4G и как 100G. Очень хороший диск и отображается он так как надо.

Какого хрена происходит? Что именно я не знаю? Как сделать, чтобы ls показывала истинный размер файла? Почему клоны отображаются нормально? Очень неудобно создавать диск виртуалки, а потом делать его клон лишь для того, чтобы с ним работать по человечески. Можно как-то изменить какие-то его атрибуты?



Последнее исправление: explorer (всего исправлений: 1)

Команда ls показывает ровно то, что возвращает реализация ФС в ядре. Специализированные программы, которые целиком загружают содержимое файлов в память или могут парсить заголовки кокретных форматов, могут показывать более актуальную информацию.

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

И я могу поменять какие-то атрибуты этой второй коровы (qcow2), чтобы ее размер отображался в ls и коммандере по человечески? Ведь клоны то нормально отображаются.

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

Любые клиенты, использующие для отображения сведений о файлах stat() или подобные обертки над соответствующими системными вызовами будут показывать то, что сообщает ядро. Поменять эту информацию можно только поменяв реализацию ФС в ядре, или загрузив (например LD_PRELOAD’ом) свою библиотеку с реализациями этих функций с измененной логикой (что может существенно ударить по производительности)

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

Это понятно. Что мне непонятно, как это все в qemu реализовано? Почему когда я создаю виртуальный диск он получается таким идиотским? Впрочем, когда другие его создают, тоже такой - скачал готовый хуникс для квм, тоже qcow2 100Г и также отображается. Но когда я клонирую - он нормальный. Т.е. комманда qemu-img видит, его истиный размер и видит до какого размера он может расширяться. И он тоже qcow2!

Т.е. вопрос как мне не клонируя изменить сам qcow2 файл? Почему 2 файла qcow2, оригинал и клон отображаются по разному, один 4г, другой 100г, если оба расширяемы до 100 и оба весят 4? Я не разбираюсь в этой теме. Раз есть клон с человеческим лицом, то и оригинал можно привести к нормальному виду. Разве нет?

explorer
() автор топика
Последнее исправление: explorer (всего исправлений: 1)

Очень хороший диск и отображается он так как надо.

Клон просто unsparse, ничего хорошего.

показывают, что на диске осталось 0 места

Плохие негодные файловые менеджеры. Dolphin тоже одно время сходил с ума при работе с btrfs и XFS with reflinks.

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

Короче, если я правильно понимаю, решения не существует? Либо конвертировать каким либо образом, либо? Может можно скормить какой-нибудь параметр, чтобы qemu создавал нормальный диск? И почему клон unsparse. Он же расширяемый? Хорошо, оригинал файл sparse, но свободное место у него же не забито нулями! Ничего не понимаю.

explorer
() автор топика

Понятно, что это спарс файлы, которые команда ls видит совершенно по идиотски, как если бы они в самом деле занимали 100G.

Если это разряженные файлы, то ls всё увидит правильно. Нужно только указать параметр -s:

$ ls -lsh some_sparse_file.raw
2.1M -rw-r--r-- 1 ........ 918M Thu  20  2020 some_sparse_file.raw

В файле размером 918 МБ реально выделено на диске всего 2,1 МБ.

gag ★★★★★
()

Я копирую файл, который как бы 100G, по факту 4G, на другой физический диск, где свободного места 20G и …*опа.

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

Например, банальный cp по-умолчанию использует эвристику определения разряженности. Если наперёд знаешь, что файл разряженный, то можно явно это указать: cp --sparse=always.

Если файл уже плохо скопирован, т.е. перестал быть разряженным, то можно его сделать разряженным без дополнительных операций копирования: fallocate -d.

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