Linux: сохранить образ устройства в файл [РЕШЕНО]
Модератор: Модераторы
Linux: сохранить образ устройства в файл [РЕШЕНО]
Всем доброго!
Известна утилита dd, которая пишет устройство в файл и обратно.
Возможно ли сделать то же средствами Паскаля?
Известна утилита dd, которая пишет устройство в файл и обратно.
Возможно ли сделать то же средствами Паскаля?
Последний раз редактировалось Владимир 25.06.2023 12:01:57, всего редактировалось 1 раз.
-
xchgeaxeax
- постоялец
- Сообщения: 207
- Зарегистрирован: 11.05.2023 02:51:40
А в чем проблема?далее sudo ./as_dd и на выходе в файле test.bin первые 10 Мб c HDD/USB флешки
Код: Выделить всё
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.Благодарю, пробую.
- Alexander
- энтузиаст
- Сообщения: 878
- Зарегистрирован: 18.12.2005 18:10:00
- Откуда: оттуда
- Контактная информация:
Общий принцип такой.
Для сохранения образа желательно применять архивацию, а для того нужно (по возможности) заполнить неиспользованную часть файловой систему нулями - это позволит архиватору её эффективно сжать.
Можно не 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('');
Для сохранения образа желательно применять архивацию, а для того нужно (по возможности) заполнить неиспользованную часть файловой систему нулями - это позволит архиватору её эффективно сжать.
Можно не 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('');
Всем спасибо!
Добавлено спустя 18 часов 37 минут 45 секунд:
на выходе в файле test.bin первые 10 Мб c HDD/USB флешки[/quote]
Еще вопрос: как определить и показать пользователю, что запись на флешку завершена? По факту запись на флешку 1 Гб длится около 4 мин (работает кэш), тогда как цикл записи на экране якобы завершен за несколько секунд.
Добавлено спустя 18 часов 37 минут 45 секунд:
на выходе в файле test.bin первые 10 Мб c HDD/USB флешки[/quote]
Еще вопрос: как определить и показать пользователю, что запись на флешку завершена? По факту запись на флешку 1 Гб длится около 4 мин (работает кэш), тогда как цикл записи на экране якобы завершен за несколько секунд.
-
xchgeaxeax
- постоялец
- Сообщения: 207
- Зарегистрирован: 11.05.2023 02:51:40
Владимир писал(а):Еще вопрос: как определить и показать пользователю, что запись на флешку завершена? По факту запись на флешку 1 Гб длится около 4 мин (работает кэш), тогда как цикл записи на экране якобы завершен за несколько секунд.
Код: Выделить всё
// Добавьте в цикл
Flush(Fo);Спасибо. Новое дело.xchgeaxeax писал(а):Flush(Fo);
В разделе диска доступно 17 Гб из 30. Файл размером 1 Гб пишется без проблем. Запись файла 8 Гб останавливается на 4,2 Гб с сообщением Disc full.
На другой машине доступно 44 Гб, при записи 16 Гб останавливается на 11,9 Гб с сообщением Disc full.
Спасибо. Новое дело.Владимир писал(а):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 - получили разницу, т.к. система сама подмонтировала флешку и ее размер изменился.
ВСЕМ СПАСИБО!!!
Владимир
Какая файловая система, и какая разрядность Лазаря?останавливается на 4,2 Гб с сообщением Disc full.
