Команда dd вызвала ошибку сегментации и теперь зависла в оболочке

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

$ bzcat file.bz2 | wc -c
1234

В качестве альтернативы найдите какой-нибудь инструмент, который делает это без лишней трубы (, может быть немного более эффективным):

$ 7z t file.bz2
[...]
Everything is Ok
Size:       1234

Это также относится к gzip и другим форматам. Хотя gzip -l file.gzпечатает размер, это может быть неверный результат. Как только файл достигает определенного размера, вы получаете что-то вроде:

$ gzip --list foobar.gz 
         compressed        uncompressed  ratio uncompressed_name
           97894400            58835168 -66.4% foobar
$ gzip --list foobar.gz 
         compressed        uncompressed  ratio uncompressed_name
         4796137936                   0   0.0% foobar

Или если файл был объединен или просто неправильно создан:

$ truncate -s 1234 foobar
$ gzip foobar
$ cat foobar.gz foobar.gz > barfoo.gz
$ gzip -l barfoo.gz 
         compressed        uncompressed  ratio uncompressed_name
                 74                1234  96.0% barfoo
$ zcat barfoo.gz | wc -c
2468

Размер не соответствует, так что это ненадежно.

Иногда можно схитрить, смотря что внутри архива. Например, если это сжатый образ файловой системы с заголовком метаданных в начале, вы можете распаковать только этот заголовок, а затем прочитать из него общий размер файловой системы.

$ truncate -s 1234M foobar.img
$ mkfs.ext2 foobar.img
$ bzip2 foobar.img
$ bzcat foobar.img.bz2 | head -c 1M > header.img
$ tune2fs -l header.img
tune2fs 1.45.4 (23-Sep-2019)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          95b64880-c4a7-4bea-9b63-6fdcc86d0914
[...]
Block count:              315904
Block size:               4096

Таким образом, извлекая крошечную часть, вы узнаете, что это 315904 блока по 4096 байт, что составляет 1234 МБ.

Нет гарантии, что это будет реальный размер сжатого файла, (он может быть больше или меньше, )но если не принимать никаких странных вещей, в любом случае он заслуживает большего доверия, чем gzip -l.

И последнее, но не менее важное: если эти файлы были созданы вами, просто запишите их размер.

0
11.11.2020, 20:44
1 ответ

Это не лучший способ клонирования системы. Если вы копируете /dev/sda1в /dev/sdb1, вы копируете первый раздел диска sdaв первый раздел диска sdb. Он не копирует бутстрап или что-то еще. Это также не будет правильным, если на диске sdbна самом деле нет таблицы разделов (или если разделы на диске sdbнастроены неправильно ).

Если два диска идентичны (или, по крайней мере, если они имеют одинаковый размер ), и вы действительно хотите использовать dd, вы хотите скопировать /dev/sdaв /dev/sdb.

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

Кроме того, вы не упомянули, как во второй системе (, которую вы хотите скопировать в ), вы оказались в положении, когда вы смогли ddсодержимое внешнего диска на жесткий диск системы. Если вы попытаетесь сделать это, фактически загрузив вторую систему и скопировав содержимое внешнего диска на жесткий диск системы (во время работы системы )-, что, судя по вашему описанию, вы могли сделать -. ] это определенно не сработает и уничтожит файловую систему на второй системе, пока система работает. Чтобы сделать это успешно, вам нужно будет загрузить вторую систему из какого-либо другого источника (, например, из живого образа дистрибутива Linux на съемном носителе ), и выполнить ddпри загрузке из этого источника.

1
18.03.2021, 22:50

Теги

Похожие вопросы