Действительно ли возможно использовать dd для клонирования только части жесткого диска, который используется?

Если Вы хотите ограничить себя обнаружением ELF, можно прочитать заголовок ELF /proc/$PID/exe самостоятельно. Это довольно тривиально: если 5-й байт в файле равняется 1, это - 32-разрядный двоичный файл. Если это 2, это является 64-разрядным. Для добавленной проверки исправности:

  1. Если первые 5 байтов 0x7f, "ELF", 1: это - двоичный файл ELF на 32 бита.
  2. Если первые 5 байтов 0x7f, "ELF", 2: это - двоичный файл ELF на 64 бита.
  3. Иначе: это неокончательно.

Вы могли также использовать objdump, но это устраняет Ваш libmagic зависимость и замены это с a libelf один.

Иначе: можно также проанализировать /proc/$PID/auxv файл. Согласно proc(5):

Это содержит содержание информации об интерпретаторе ELF, переданной процессу в исполнительное время. Формат является одним неподписанным длинным идентификатором плюс одно неподписанное длинное значение для каждой записи. Последняя запись содержит два нуля.

Значения unsigned long ключи находятся в /usr/include/linux/auxvec.h. Вы хотите AT_PLATFORM, который является 0x00000f. Не заключайте мне в кавычки на этом, но кажется, что значение должно быть интерпретировано как a char * получить строковое описание платформы.

Можно найти этот вопрос о StackOverflow полезным.

Еще один путь: можно сообщить динамическому компоновщику (man ld) вывести информацию об исполняемом файле. Это распечатывает к стандартному выводу декодируемую структуру AUXV. Предупреждение: это - взлом, но он работает.

LD_SHOW_AUXV=1 ldd /proc/$SOME_PID/exe | grep AT_PLATFORM | tail -1

Это покажет что-то как:

AT_PLATFORM:     x86_64

Я попробовал его на 32-разрядном двоичном файле и добрался i686 вместо этого.

Как это работает: LD_SHOW_AUXV=1 дает Динамическому Компоновщику команду выводить декодируемую структуру AUXV прежде, чем выполнить исполняемый файл. Если Вам действительно не нравится делать Вашу жизнь интересной, Вы не хотите на самом деле работать, сказал исполняемый файл. Один способ загрузиться и динамично связать его, на самом деле не называя main() функция состоит в том, чтобы работать ldd(1) на нем. Оборотная сторона: LD_SHOW_AUXV включен оболочкой, таким образом, Вы получите дампы структур AUXV для: подоболочка, ldd, и Ваш целевой двоичный файл. Так мы grep для AT_PLATFORM, но только сохраняют последнюю строку.

Парсинг auxv: если Вы анализируете auxv структура самостоятельно (не полагающийся на динамический загрузчик), затем существует что-то вроде загадки: auxv структура следует правилу процесса, который это описывает, таким образом, sizeof(unsigned long) будет 4 для 32-разрядных процессов и 8 для 64-разрядных процессов. Мы можем сделать эту работу для нас. Для этого для работы над 32-разрядными системами все коды клавиши должны быть 0xffffffff или меньше. В 64-разрядной системе старшие значащие 32 бита будут нулем. Машины Intel являются прямыми порядками байтов, таким образом, эти 32 бита следуют за младшими значащими в памяти.

По сути, все, что необходимо сделать:

1. Read 16 bytes from the `auxv` file.
2. Is this the end of the file?
3.     Then it's a 64-bit process.
4.     Done.
5. Is buf[4], buf[5], buf[6] or buf[7] non-zero?
6.     Then it's a 32-bit process.
7.     Done.
8. Go to 1.

Парсинг файла карт: это было предложено Gilles, но не вполне работало. Вот измененная версия, которая делает. Это полагается на чтение /proc/$PID/maps файл. Если списки файлов 64-разрядные адреса, процесс составляет 64 бита. Иначе это - 32 бита. Проблема заключается, в котором ядро упростит вывод путем разделения продвижения, обнуляет от шестнадцатеричных адресов в группах 4, таким образом, взлом длины не может вполне работать. awk к спасению:

if ! [ -e /proc/$pid/maps ]; then
   echo "No such process"
else
    case $(awk 

Это работает путем проверки начального адреса последней карты распределения памяти процесса. Они перечислены как 12345678-deadbeef. Так, если процесс будет 32-разрядным, то тот адрес будет восемью шестнадцатеричными цифрами долго, и девятым будет дефис. Если это будет 64-разрядное, то самый высокий адрес будет длиннее, чем это. Девятый символ будет шестнадцатеричной цифрой.

Знайте: всем кроме первых и последних методов нужно ядро Linux 2.6.0 или более новый, начиная с auxv файл не был там прежде.

2
10.09.2014, 03:29
2 ответа

Невозможно dd части файловой системы

Вы можете использовать dd для копирования целого раздела, который может быть только частью жесткого диска.

Вы спрашиваете, можно ли использовать dd для копирования части раздела.

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

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

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

Изменить размер файловой системы, затем использовать dd

Одним из способов сделать что-то похожее на то, о чем вы просите, было бы изменение размера раздела.

На первом этапе измените размер раздела 300 ГБ, который заполнен только на треть, на раздел чуть больше 100 ГБ, который почти заполнен.

gparted, графический интерфейс GNOME для библиотеки libparted, является обычно рекомендуемым менеджером разделов, но существует также parted CLI-функция (и фактически является эталонной реализацией libparted). cfdisk, fdisk и т.п. также являются опциями CLI, и хотя я бы сказал, что они менее дружественны, чем gparted, большинство дистрибутивов Linux должны иметь их как часть основного пакета утилит.

После изменения размера, вы можете использовать dd стандартным способом на полном разделе, содержащем полную файловую систему.

Инструмент архивации файловой системы

В зависимости от того, что вы хотите сделать, это также может быть полезно:

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

Я бы не рекомендовал этот инструмент в целом для создания образов из-за пользовательского формата, но как промежуточное состояние он может иметь смысл. Вы создадите образ существующего раздела, которому не потребуется место для пустой части файловой системы. Затем вы сможете использовать его для распаковки на другой раздел и другую файловую систему. Файловая система создается fsarchiver как часть распаковки.

3
27.01.2020, 22:00

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

partimageтакже может сделать это с менее поддерживаемыми файловыми системами.

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

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

Для точных команд требуется дополнительная информация, например, об исходной файловой системе, поскольку partimageесть версии, -специфичные для файловой системы.

1
27.01.2020, 22:00

Теги

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