Linux: сохранить образ устройства в файл [РЕШЕНО]

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Linux: сохранить образ устройства в файл [РЕШЕНО]

Сообщение Владимир »

Всем доброго!
Известна утилита dd, которая пишет устройство в файл и обратно.
Возможно ли сделать то же средствами Паскаля?
Последний раз редактировалось Владимир 25.06.2023 12:01:57, всего редактировалось 1 раз.
xchgeaxeax
постоялец
Сообщения: 207
Зарегистрирован: 11.05.2023 02:51:40

Сообщение xchgeaxeax »

А в чем проблема?

Код: Выделить всё

program as_dd;

uses
  SysUtils;

const
  FiName = '/dev/sda';
  FoName = 'test.bin';

function DD_Work(FiName, FoName: String; BlockSize, Count: LongInt): LongInt;
var
  Fi: File;
  Fo: File;
  Bf: array of Byte;
  Sz, Wr, Cn, i: LongInt;
begin
  SetLength(Bf, BlockSize);
  AssignFile(Fi, FiName);
  AssignFile(Fo, FoName);
  Reset(Fi, 1);
  Rewrite(Fo, 1);
  Cn := 0; Sz := 0; Wr := 0;
  for i := 1 to Count do begin
    BlockRead (Fi, Bf[0], BlockSize, Sz);
    if Sz = 0   then break;
    BlockWrite(Fo, Bf[0], Sz,     Wr);
    if Sz <> Wr then break;
    inc(Cn, Wr);
  end;
  CloseFile(Fo);
  CloseFile(Fi);
  Result := Cn;
end;

begin
  DD_Work(FiName, FoName, 512 * 1024, 20);
end.
далее sudo ./as_dd и на выходе в файле test.bin первые 10 Мб c HDD/USB флешки
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

Благодарю, пробую.
Аватара пользователя
Alexander
энтузиаст
Сообщения: 878
Зарегистрирован: 18.12.2005 18:10:00
Откуда: оттуда
Контактная информация:

Сообщение Alexander »

Общий принцип такой.

Для сохранения образа желательно применять архивацию, а для того нужно (по возможности) заполнить неиспользованную часть файловой систему нулями - это позволит архиватору её эффективно сжать.

Можно не dd, а cat, хотя и не принципиально.

Полный цикл:
1. Смонтировать ФС.
2. Заполнить нулями, создав в ней нулевой файл (или несколько файлов, используя конвеером команду split, если ФС имеет ограничение на длину файла) cat /dev/zero > zerofile.bin
3. Удалить нулевой файл. Свободное пространство ФС теперь заполнено нулями.
4. Отмонтировать ФС. sync.
5. cat /dev/sdX | bzip2 -9 > image.bz2 (если процент заполнения ФС высок можно xz -e, bzip2 хорошо и быстро сжимает нулевые промежутки, а xz данные).
Образ готов.
Для восстановления используется bzcat image.bz2 > /dev/sdX или xzcat image.xz > /dev/sdX

На Паскале можно использовать метод приведённый выше, или используя эти же команды из. fpSystem('');
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

Всем спасибо!

Добавлено спустя 18 часов 37 минут 45 секунд:
на выходе в файле test.bin первые 10 Мб c HDD/USB флешки[/quote]
Еще вопрос: как определить и показать пользователю, что запись на флешку завершена? По факту запись на флешку 1 Гб длится около 4 мин (работает кэш), тогда как цикл записи на экране якобы завершен за несколько секунд.
xchgeaxeax
постоялец
Сообщения: 207
Зарегистрирован: 11.05.2023 02:51:40

Сообщение xchgeaxeax »

Владимир писал(а):Еще вопрос: как определить и показать пользователю, что запись на флешку завершена? По факту запись на флешку 1 Гб длится около 4 мин (работает кэш), тогда как цикл записи на экране якобы завершен за несколько секунд.

Код: Выделить всё

// Добавьте в цикл
Flush(Fo);
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

xchgeaxeax писал(а):Flush(Fo);
Спасибо. Новое дело.
В разделе диска доступно 17 Гб из 30. Файл размером 1 Гб пишется без проблем. Запись файла 8 Гб останавливается на 4,2 Гб с сообщением Disc full.
На другой машине доступно 44 Гб, при записи 16 Гб останавливается на 11,9 Гб с сообщением Disc full.
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

Владимир писал(а):
xchgeaxeax писал(а):Flush(Fo);
Спасибо. Новое дело.
В разделе диска доступно 17 Гб из 30. Файл размером 1 Гб пишется без проблем. Запись файла 8 Гб останавливается на 4,2 Гб с сообщением Disc full.
НО новый поворот: исходный код работает - взял другую флешку 8Гб - полет нормальный.
Догадался выполнить dd на битой флешке, получил ошибку как раз на 4,2 Гб. Не очень понятно в этом смысле сообщение Лазаруса Disc FULL,
Выполнил dd на исправной флешке, получил файл 7,7 Gb 7,2 Gib (вывод dd) или 7386 Гб, паскалевская функция дала файл 7205 Гб.

Добавлено спустя 13 часов 11 минут 10 секунд:
Насчет разного размера файлов dd и нашей функции: все правильно.
Вставили флешку, прочитали-записали. Затем сравнили размеры полученного файла и /dev/sdb - получили разницу, т.к. система сама подмонтировала флешку и ее размер изменился.
ВСЕМ СПАСИБО!!!
Владимир
slyubez
постоялец
Сообщения: 186
Зарегистрирован: 31.03.2015 07:44:07

Сообщение slyubez »

останавливается на 4,2 Гб с сообщением Disc full.
Какая файловая система, и какая разрядность Лазаря?
Ответить