Вопрос или проблема
У меня есть жесткий диск с одной единственной btrfs
разделом (sdc1
):
# lsblk
[...]
sdc 8:32 0 465.8G 0 disk
└─sdc1 8:33 0 465.8G 0 part /mnt/exthd
Этот раздел в настоящее время полностью занят:
# btrfs fi show /dev/sdc1
Label: none uuid: 3130b777-c72d-4375-a344-43571afc3e92
Всего устройств 1 Используемые байты FS 448.74GiB
devid 1 размер 465.76GiB использовано 465.76GiB путь /dev/sdc1
# btrfs fi df /mnt/exthd
Данные, single: всего=463.73GiB, использовано=448.22GiB
Система, DUP: всего=8.00MiB, использовано=80.00KiB
Метаданные, DUP: всего=1.01GiB, использовано=533.98MiB
Глобальный резерв, single: всего=498.27MiB, использовано=0.00B
Вся площадь раздела в настоящее время выделена для одного единственного образа файла:
# ls -l /mnt/exthd
total 514224320
-rw-r--r-- 1 root root 526676328448 Aug 16 2024 backup.img
Примечание: Я использую прозрачное сжатие zstd. Вот почему размер файла (> 490GiB) даже больше, чем теоретически может поместиться на диске.
backup.img
— это образ жесткого диска, который в настоящее время выходит из строя, созданный с помощью ddrescue
. К сожалению, то, что содержит этот файл, неполное, потому что ddrescue
остановился в середине своей работы, так как закончилось место.
Поэтому я хотел бы позволить ddrescue
продолжить работу с “насколько возможно” этого частично завершенного образа файла, потому что я не знаю, как долго еще прослужит выходящий из строя жесткий диск – так что, возможно, то, что я уже успешно восстановил, может вскоре окончательно исчезнуть. Однако, поскольку раздел btrfs
находится в этом полном состоянии, ddrescue
всегда завершает работу с сообщением об ошибке “Нет места на устройстве”.
Поэтому я решил обрабатывать жесткий диск в две части: одна часть должна охватывать ту часть, которую я уже спас (так что около 400-450 GiB существующего backup.img
), а другая часть должна покрыть остальное. (Так что что-то вроде ddrescue --size=400G /dev/failinghd /mnt/exthd1/part1.img
и ddrescue --input-position=400G /dev/failinghd /mnt/exthd2/part2.img
)
Чтобы вернуть файл и раздел в состояние, с которым ddrescue
сможет работать без ошибок, я решил усечь 10-30 GiB с конца файла. Это значит, что я принимаю риск возможной усечки данных на секторах, которые я никогда не смогу восстановить, но по крайней мере я все равно смогу продолжать работать с большей частью файла как есть. Итак, я попробовал запустить:
# truncate -s 448G backup.img
truncate: не удалось усечь 'backup.img' на 481036337152 байт: Нет места на устройстве
И затем также:
# truncate -s 400G backup.img
truncate: не удалось усечь 'backup.img' на 429496729600 байт: Нет места на устройстве
Но, как вы видите, я все еще получаю сообщения об ошибках “Нет места на устройстве”.
Я также пробовал балансировку без успеха, снова из-за отсутствия свободного пространства:
# btrfs balance start /mnt/exthd -dlimit=3
ERROR: ошибка во время балансировки '/mnt/exthd': Нет места на устройстве
Это приводит меня к моему вопросу: Какой мой лучший вариант, чтобы ddrescue
продолжала работать с как можно большей частью файла, который она смогла создать до сих пор?
Я думал о следующих вариантах:
truncate
файла (как описано выше), что, похоже, не срабатывает- (временно) добавить другое устройство в файловую систему
btrfs
(например, USB-накопитель), затемtruncate
файла, затем удалить устройство из файловой системы снова (в надежде, что я усечу файл образа достаточно, чтобы он снова полностью поместился на “реальный” резервный жесткий диск)
Существуют ли другие/лучшие варианты, которые мне следует рассмотреть? Как они сравниваются?
И прежде чем я забуду: я также нашел статью FAQ btrfs
“Помощь! Btrfs утверждает, что у меня недостаточно места, но похоже, что у меня должно быть много места!” – но она только предоставляет рекомендации, как диагностировать сообщение “Нет места на устройстве”, но не предоставляет рекомендаций, как решить эту проблему.
Ответ или решение
Для решения проблемы с файлом на полностью заполненном разделе btrfs
, который мешает дальнейшей работе с программой ddrescue
, необходимо рассмотреть несколько вариантов. Во-первых, важно понимать, что btrfs
управляет пространством на диске по-своему, и сообщение о нехватке места может возникать не только из-за отсутствия свободного места, но и из-за особенностей управления метаданными и резервами.
Проблема
На данный момент ваш раздел /dev/sdc1
полностью занят файлом backup.img
, что вызывает ошибки при операции truncate
и других попытках управления файлами на этом разделе. Это приводит к невозможности продолжить восстановление данных с помощью ddrescue
, что критично в условиях, когда состояние жесткого диска, подвергающегося восстановлению, может ухудшиться.
Возможные решения
-
Использование дополнительного устройства:
Одним из самых разумных шагов будет добавление внешнего устройства, например, USB-накопителя, к файловой системеbtrfs
. Это позволит временно создать больше доступного пространства для метаданных, что может помочь в успешной операцииtruncate
.- Шаги:
- Подключите USB-накопитель.
- Добавьте его в
btrfs
, используя команду:btrfs device add /dev/sdX /mnt/exthd
Замените
/dev/sdX
на фактическое устройство вашего USB. - Запустите команду для балансировки:
btrfs balance start /mnt/exthd
- Теперь попробуйте снова выполнить операцию
truncate
:truncate -s 448G /mnt/exthd/backup.img
- После успешного завершения, вы можете удалить устройство с помощью:
btrfs device delete /dev/sdX /mnt/exthd
- Шаги:
-
Создание нового файла:
Если добавление устройства не представляется возможным или не приносит результат, есть еще один вариант. Вы можете создать новый файл меньшего размера и использоватьdd
для копирования данных из старого файла, если в нем есть восстановленные данные.- Шаги:
- Создайте новый файл:
dd if=/mnt/exthd/backup.img of=/mnt/exthd/backup_part.img bs=1G count=400
- Работайте с новым файлом
backup_part.img
вместо оригинального.
- Создайте новый файл:
- Шаги:
-
Использование сертификатов и специальных команд Btrfs:
В некоторых случаях можно использоватьbtrfs subvolumes
для управления пространством и хранения данных. Вы можете попробовать создать субтом, что может дать больше контроля над пространством и позволить продолжить работу. Однако, это потребует больше операций и специалистов в области администрирования. -
Проверка состояния файловой системы:
Перед тем как продолжать, стоит проверить целостность файловой системы с помощью:btrfs check /dev/sdc1
Обратите внимание, что выполнение этой команды на смонтированном разделе не рекомендуется. Это поможет выявить возможные проблемы, которые могут влиять на доступное пространство.
Заключение
Управление пространством на btrfs
может быть затруднительным, особенно в условиях ограничения. Однако, приемы, описанные выше, помогут вам вернуть ваш раздел в рабочее состояние и продолжить восстановление данных при помощи ddrescue
. Рекомендуется также регулярно проверять состояние жестких дисков и делать резервные копии, чтобы снизить риски потери данных.