Как вернуть большой файл на совершенно заполненном разделе btrfs в "рабочее" состояние, например, обрезав его?

Вопрос или проблема

У меня есть жесткий диск с одной единственной 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, что критично в условиях, когда состояние жесткого диска, подвергающегося восстановлению, может ухудшиться.

Возможные решения

  1. Использование дополнительного устройства:
    Одним из самых разумных шагов будет добавление внешнего устройства, например, USB-накопителя, к файловой системе btrfs. Это позволит временно создать больше доступного пространства для метаданных, что может помочь в успешной операции truncate.

    • Шаги:
      1. Подключите USB-накопитель.
      2. Добавьте его в btrfs, используя команду:
        btrfs device add /dev/sdX /mnt/exthd

        Замените /dev/sdX на фактическое устройство вашего USB.

      3. Запустите команду для балансировки:
        btrfs balance start /mnt/exthd
      4. Теперь попробуйте снова выполнить операцию truncate:
        truncate -s 448G /mnt/exthd/backup.img 
      5. После успешного завершения, вы можете удалить устройство с помощью:
        btrfs device delete /dev/sdX /mnt/exthd
  2. Создание нового файла:
    Если добавление устройства не представляется возможным или не приносит результат, есть еще один вариант. Вы можете создать новый файл меньшего размера и использовать dd для копирования данных из старого файла, если в нем есть восстановленные данные.

    • Шаги:
      1. Создайте новый файл:
        dd if=/mnt/exthd/backup.img of=/mnt/exthd/backup_part.img bs=1G count=400
      2. Работайте с новым файлом backup_part.img вместо оригинального.
  3. Использование сертификатов и специальных команд Btrfs:
    В некоторых случаях можно использовать btrfs subvolumes для управления пространством и хранения данных. Вы можете попробовать создать субтом, что может дать больше контроля над пространством и позволить продолжить работу. Однако, это потребует больше операций и специалистов в области администрирования.

  4. Проверка состояния файловой системы:
    Перед тем как продолжать, стоит проверить целостность файловой системы с помощью:

    btrfs check /dev/sdc1

    Обратите внимание, что выполнение этой команды на смонтированном разделе не рекомендуется. Это поможет выявить возможные проблемы, которые могут влиять на доступное пространство.

Заключение

Управление пространством на btrfs может быть затруднительным, особенно в условиях ограничения. Однако, приемы, описанные выше, помогут вам вернуть ваш раздел в рабочее состояние и продолжить восстановление данных при помощи ddrescue. Рекомендуется также регулярно проверять состояние жестких дисков и делать резервные копии, чтобы снизить риски потери данных.

Оцените материал
Добавить комментарий

Капча загружается...