Место на диске, архив и проверенное восстановление
Приложение не может сохранить журнал: «No space left on device». Вы удаляете большой файл, но место не появляется сразу. Позже нужная заметка случайно меняется, и оказывается, что копия была только в той же папке. Хранение нужно понимать по границам файловой системы, открытых процессов и резервного восстановления.
В прошлых главах вы создавали файлы и запускали процессы. Теперь свяжем их с местом. Не будем форматировать диски, менять разделы или очищать системные каталоги. Практика работает с несколькими маленькими файлами в своей папке и занимает примерно тридцать минут.
Файловая система и каталог
df -h "$HOME"
du -sh "$HOME/linux-course-service" 2>/dev/nullDf показывает ёмкость файловой системы для указанного пути, du оценивает занятое пространство выбранного дерева. Если служебная папка не создавалась, второй вызов может завершиться ошибкой; отсутствие вывода с подавленным stderr не доказывает нулевой размер. Для диагностики уберите перенаправление и проверьте точный путь.
Размер содержимого и выделенные дисковые блоки могут различаться. Sparse-файл содержит логические промежутки, которым не обязательно соответствует столько же записанных блоков. На диске есть служебные данные и ограничения. В Linux df -i дополнительно показывает inode: множество маленьких файлов может исчерпать эти объекты раньше байтов. Не используйте один процент как полную модель любых ошибок записи.
Если удалён файл, который процесс ещё держит открытым, его содержимое может оставаться выделенным до закрытия последнего нужного дескриптора. Поэтому поиск имени и учёт места способны расходиться. Решение требует выяснить владельца открытого ресурса, а не повторять удаление других файлов. В учебном курсе не будем создавать огромные заполнители ради этого симптома.
Архив и сжатие
Архив объединяет файлы и метаданные в один объект. Сжатие уменьшает некоторые виды данных, но не гарантирует одинаковый коэффициент. Tar создаёт архив, gzip может сжать его. Ни наличие расширения, ни завершение команды само по себе не заменяют проверку содержимого и восстановление.
backup_lab_dir=$(mktemp -d)
mkdir -p "$backup_lab_dir/source/docs" "$backup_lab_dir/restore"
printf 'draft one\n' > "$backup_lab_dir/source/docs/notes.txt"
printf 'ready\n' > "$backup_lab_dir/source/status.txt"
tar -czf "$backup_lab_dir/project.tar.gz" -C "$backup_lab_dir/source" .
tar -tzf "$backup_lab_dir/project.tar.gz"-c создаёт, -t перечисляет, -f выбирает файл архива, -z использует gzip. -C задаёт каталог для следующих имён. Архив лежит снаружи source, поэтому не должен включать сам себя. В списке ожидаются docs/notes.txt и status.txt вместе с каталогами; точные префиксы вроде ./ и порядок могут отличаться.
Создаём только собственный архив с известными путями. Для чужого архива сначала изучают имена и доверие к источнику: абсолютные пути, .. и ссылки требуют осторожности. Не извлекайте неизвестный архив поверх домашнего каталога или /.
Восстановление в новое место
tar -xzf "$backup_lab_dir/project.tar.gz" -C "$backup_lab_dir/restore"
cmp "$backup_lab_dir/source/docs/notes.txt" "$backup_lab_dir/restore/docs/notes.txt"
printf 'compare status=%s\n' "$?"-x извлекает. Cmp при одинаковых байтах обычно не печатает текст и возвращает 0. Ненулевой статус требует разбора: файл отличается либо возникла ошибка чтения. Только после такой проверки можно обсуждать пригодность этой маленькой копии.
Теперь измените именно "$backup_lab_dir/source/docs/notes.txt", а восстановленный файл оставьте прежним:
printf 'draft two\n' > "$backup_lab_dir/source/docs/notes.txt"
cmp "$backup_lab_dir/source/docs/notes.txt" "$backup_lab_dir/restore/docs/notes.txt"
printf 'changed compare status=%s\n' "$?"
mkdir "$backup_lab_dir/restore-again"
tar -xzf "$backup_lab_dir/project.tar.gz" -C "$backup_lab_dir/restore-again"
cat "$backup_lab_dir/restore-again/docs/notes.txt"Cmp ожидаемо возвращает 1: это намеренное различие старой и новой версии, а не ошибка архива. Повторное извлечение в новый пустой каталог печатает draft one. Архив восстанавливает сохранённую версию, а не нынешнее содержимое источника. Если источник активно меняется во время tar, набор может не быть согласованным снимком. Для БД копирование файлов открытой базы может быть вообще неподходящим протоколом; нужен её штатный backup.
Что считать резервной копией
Копия на том же виртуальном диске спасает от некоторых ошибок редактирования, но не от потери диска VM. Backup требует определённой области отказа: отдельный носитель или другой предусмотренный путь, сроки хранения, доступ и проверку чтения. Snapshot VM удобен для эксперимента, но не автоматически заменяет независимую резервную копию.
Контрольная сумма помогает обнаружить изменение байтов. В Ubuntu есть sha256sum; на macOS часто используется shasum -a 256. Сумма без доверенного исходного значения не доказывает происхождение файла и не восстанавливает данные. Не обещайте безопасность содержимого только по совпадению hash.
Нужно учитывать секреты и права. Архив приватного файла может стать читаемым другим пользователем при неудачной настройке каталога хранения. Перед реальным backup определите шифрование, доступ и срок. Для курса сохраняем только учебный текст без credentials, поэтому внешний сервис хранения не требуется.
Самостоятельная лаборатория
Добавьте файл с пробелом, создайте новый архив вне исходного дерева, перечислите его и восстановите в ещё один пустой каталог. Проверьте каждый ожидаемый файл, включая имя с пробелом. Затем составьте два сценария: ошибочная правка одного файла и потеря всего виртуального диска.
Критерии готовности: источник не удалён, восстановление не выполнялось поверх него, содержимое проверено cmp или подходящим checksum. Вы объясняете, какой сценарий покрывает локальный архив и какой не покрывает. Нет вывода «backup работает» только из успешного tar без чтения результата.
Разбор
Правка после архива не меняет сохранённые байты. Для её отмены достаточно извлечь прежнюю версию отдельно и проверить перед заменой. Потеря диска требует копии вне того же диска; архив внутри него исчезнет вместе с источником. В финальном проекте объедините эту проверку с запуском, диагностикой и документированным восстановлением.
Первичные источники: GNU tar tutorial, GNU Coreutils: df, du, Linux unlink.