Страницы

Поиск по вопросам

Показаны сообщения с ярлыком iso-образ. Показать все сообщения
Показаны сообщения с ярлыком iso-образ. Показать все сообщения

понедельник, 3 февраля 2020 г.

Как монтировать ISO-образы на Windows 7?

#windows #поиск_программ #образ #iso_образ


Многие крупные скачиваемые обновления поставляются в виде образов для болванок -
файлов формата ISO. Прожигать диски, чтобы с них устанавливать обновления, - это пустая
трата расходников, потому что после обновления диски уже не нужны - получается, что
это диски однократного использования. Вопрос в том, как правильно монтировать образы
в Windows, какие для этого существуют встроенные или устанавливаемые инструменты?    


Ответы

Ответ 1



Daemon tools (Lite-версия бесплатна), alcohol и множество других ,есть кстати и утилита от майкрософта, но не помню, как называется... Да и в конце концов можно просто открыть архиватором - 7-zip'ом, например. )

Ответ 2



Давно использую Virtual CloneDrive. Бесплатная, работает хорошо, позволяет создавать несколько виртуальных дисководов и умеет автоматически подключать образ после перезагрузки. Имеется русский язык (и не только). Впрочем, он там не особо нужен.

Ответ 3



Лучше UltraISO не найти. Он не только монтирует, ну и сжимает папки в ISO. А еще плюс такой, скачали .MDF (.mds не качайте, он не нужен), переименовываете в ISO и монтируете! На счет Daemon tools вы должны иметь ввиду, что NOD32 ругается что там вирус, и приходится добавлять исключения вручную. Потому от использования этой программы я навеки отказался. Обратитесь ко мне, дам скачать через свой сервер напрямую!

Ответ 4



XP: Small, Free Way to Use and Mount Images (ISO files) Without Burning Them.В отличии от демона и алкоголя не нужно перегружать комп. Маленькая, простая, шустрая.

Ответ 5



От себя порекомендовал бы https://ru.wikipedia.org/wiki/ImDisk Компактная и многофункциональная утилита. Абсолютно бесплатная и позволяет работать с образами разных форматов. Часто использую ее для эмуляции дискет. Скачать: http://www.ltr-data.se/opencode.html/#ImDisk

Запись образа на флэшку

#ubuntu #iso_образ


Есть ISO-образ Windows 10, Ubuntu 14.04 и флешка на 8Gb. Как записать загрузочную
флешку для установки?

То есть нужна рабочая  и простая утилита, где нужно указать ссылку на образ и куда
записать, и не более..) Поиск ничего рабочего не дал.
    


Ответы

Ответ 1



предуведомление о загрузке образов именно ms/windows с usb-устройств. подготовка такого носителя —- это нетривиальный процесс и «уложить» его в рамки одной программы/скрипта — длительная (и неблагодарная) работа, которую, как вы, вероятно, уже обнаружили, до сих пор никто не проделал. см. ниже обновление. копирование образов как таковых копирование образов в операционной системе gnu/linux осуществляется так же, как и копирование любых других файлов — программой cp. в случае с доступом к физическим устройством эта программа, естественно, должна выполняться с root-овыми привилегиями. например, используя sudo: $ sudo cp /путь/к/файлу/с/образом /dev/блочное-устройство и обратная процедура (с блочного устройства в файл): $ sudo cp /dev/блочное-устройство /путь/к/файлу/с/образом все разделы на блочном устройстве, во избежание проблем, должны быть отмонтированы (то, что в графическом интерфейсе для «флэшек» называется как-нибудь вроде «извлечь устройство», применять в данном случае нельзя — usb-устройство будет логически выключено). посмотреть список примонтированных разделов (и уточнить, куда именно они примонтированы) можно программами df или mount, отмонтировать: $ sudo umount /путь/к/разделу/блочного/устройства или $ sudo umount /путь/к/точке/монтирования определить имя нужного блочного устройства можно по-разному. в случае извлекаемого usb-накопителя это проще делать, просмотрев последние записи кольцевого буфера ядра (сразу после подключения устройства) с помощью программы dmesg. примерный вывод: $ dmesg | tail ... [17614.102720] sd 2:0:0:0: [sdb] Attached SCSI removable disk sdb — в данном случае и есть имя блочного устройства вот это имя и надо подставить в команду: $ sudo cp /путь/к/файлу/с/образом /dev/sdb учтите, что сразу же после завершения этой команды ещё не вся буферизованная информация «сброшена» на устройство. для очистки буферов выполните программу: $ sync после этого usb-устройство можно извлекать. обновление по поводу установочных образов ms/windows проблема здесь заключается не в том, «как бы так хитро записать образ», а в том, что стандартная программа установки ms/windows, после запуска, в поиске остальных файлов, необходимых для продолжения установки, будет просматривать лишь носители, отвечающие следующим требованиям: это либо cd/dvd-устройство, либо устройство, подключенное через интерфейс sata/pata и не являющееся съёмным. т.н. «usb-флэшки» подключаются через интерфейс sata, как и традиционные современные «винчестеры», но, в отличие от «винчестеров», рапортуют о том, что они являются съёмными. посмотреть результат такого рапорта в операционной системе gnu/linux можно в файле /sys/block/имя-устройства/removable. например, так сообщает о себе «usb-флэшка» с именем sdf: $ cat /sys/block/sdf/removable 1 а вот так сообщает о себе «винчестер» (sda): $ cat /sys/block/sda/removable 0 кстати, этот рапорт ничуть не изменится, если «винчестер» подключить не напрямую к sata-контроллеру на материнской плате, а, например, к контроллеру usb через «переходник» usb-sata/pata. для «обхода» подобной логики программы-инсталлятора, как я понимаю, существует три пути (отсортированы по степени реалистичности): записать образ на cd/dvd или на «винчестер» изменить микро-программу внутри «usb-флэшки» так, чтобы она рапортовала о своей «несъёмности» (для некоторых устройств это возможно, но нет никаких гарантий, что устройство при этом не превратится в «кирпич») «пропатчить» программу-инсталлятор так, чтобы она искала необходимые файлы и на съёмных sata/pata-носителях

Ответ 2



Воспользуйтесь утилитой dd dd if=ОБРАЗ_ДИСКА.iso of=/dev/ДИСК

Ответ 3



Тебе нужна утилита UNetbootin. Она очень проста в использовании. Скармливаешь ей образ и делаешь запись. Предварительно можно отформатировать.

Ответ 4



С Windows 7 прокатывал такой вариант: Ставим gparted. Форматируем через него флэшку в NTFS. Не забываем установить на флэшку флаг "boot" через управление флагами во всё том же gparted. Монтируем образ с windows. Просто копируем содержимое на флэшку через cp -r или rsync -avrh или drag'n'drop.

Ответ 5



Воспользуйся программой Unetbootin https://unetbootin.github.io/ Никогда не подводила

воскресенье, 26 января 2020 г.

Создать iso своей системы Ubuntu 11.10

#linux #ubuntu #образ #iso_образ


Есть система, на которой установлено множество пакетов и произведено множество настроек.
Как создать iso образ этой системы сохраняя все настройки? Пробовал remastersys, но
никак не могу установить ее ни с репозиториев, ни с исходников. Вариант подобный "Suse
Studio" для Ubuntu тоже рассматривается UPD:   Для решения задачи подошла программа
"relinux"
    


Ответы

Ответ 1



Для клонирования Linux системы можно воспользоваться средствами MondoRescue. Они позволяют сохранить работающую систему на диск и восстановить систему с диска.

четверг, 26 декабря 2019 г.

Как установить AltLinux 7.0.5 из .iso при помощи GRUB2?

#linux #grub #iso_образ #altlinux


Что надо написать в конфиг grub2, чтобы загрузился дистрибутив AltLinux 7.0.5 ?

Понятно, что нужно указать loop для grub.

menuentry "AltLinux 7.0.5"{
        insmod loopback
#       search --set --fs-uuid b316cbc2-4695-480c-b9b9-a555350d458a
        set isofile=/iso/altlinux-7.0.5-school-master-x86_64-ru-install-dvd5.iso
        loopback loop (${root})${isofile}
        linux (loop)/syslinux/alt0/vmlinuz iso-scan/filename=$isofile
        initrd (loop)/syslinux/alt0/full.cz
}


Непонятно, какие параметры передавать в строке параметров ядра,
так как для этого надо знать, как собирался full.cz (=initrd от altlinux) и какие
параметры он понимает.

Такая загрузка совершенно точно возможна в Ubuntu, в Debian и в Fedora.

вот такой же вопрос, только он там не отвечен:
https://www.linux.org.ru/forum/linux-install/5934581
вот этот вопрос в виде обобщенном для любых дистрибутивов:
Как загрузиться с iso?
(отвечен на примере Ubuntu)

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


Ответы

Ответ 1



menuentry "AltLinux 7.0.5, simply install" { set gfxpayload=keep insmod gzio insmod part_msdos insmod ext2 insmod xfs set bootpart=uuid:df46d821-e7f9-4e35-bbd2-728bdce8d89a set isodir=/iso/Alt705simple set isofile=altlinux-7.0.5-simply-x86_64-install-dvd5.iso loopback loop (${root})${isodir}/${isofile} linux (loop)/syslinux/alt0/vmlinuz automatic=method:disk,${bootpart},directory:${isodir}/${isofile} ramdisk_size=183210 changedisk lang=ru_RU splash noeject xdriver=auto quiet=1 showopts initrd (loop)/syslinux/alt0/full.cz }

Ответ 2



Пример моего 40_custom menuentry "AltLinux 7.0.5, simply install" { insmod loopback set gfxpayload=keep insmod gzio insmod part_msdos insmod ext2 insmod xfs set bootpart=uuid:603ef866-453a-4c27-9799-3f03e6c167de set isodir=/iso set isofile=altlinux-7.0.5-simply-x86_64-install-dvd5.iso loopback loop (${root})${isodir}/${isofile} linux (loop)/syslinux/alt0/vmlinuz automatic=method:disk,${bootpart},directory:${isodir}/${isofile} ramdisk_size=183210 changedisk lang=ru_RU splash noeject xdriver=auto quiet=1 showopts initrd (loop)/syslinux/alt0/full.cz } menuentry "Alt Linux 7.0.5 Simply failsafe" { insmod loopback set gfxpayload=keep insmod gzio insmod part_msdos insmod ext2 insmod xfs set bootpart=uuid:603ef866-453a-4c27-9799-3f03e6c167de set isodir=/iso set isofile=altlinux-7.0.5-simply-x86_64-install-dvd5.iso loopback loop (${root})${isodir}/${isofile} linux (loop)/syslinux/alt0/vmlinuz lowmem automatic=method:disk,${bootpart},directory:${isodir}/${isofile} ramdisk_size=183210 showopts noapic pci=nomsi acpi=off noload=ahci initrd (loop)/syslinux/alt0/full.cz } menuentry "Alt Linux 7.0.5 Simply LiveCD" { insmod loopback set gfxpayload=keep insmod gzio insmod part_msdos insmod ext2 insmod xfs set bootpart=uuid:603ef866-453a-4c27-9799-3f03e6c167de set isodir=/iso set isofile=altlinux-7.0.5-simply-x86_64-install-dvd5.iso loopback loop (${root})${isodir}/${isofile} linux (loop)/syslinux/alt0/vmlinuz lowmem lang=ru_RU automatic=method:disk,${bootpart},directory:${isodir}/${isofile} fastboot splash=silent splashcount=17 stagename=live showopts noeject noprompt -- initrd (loop)/syslinux/alt0/full.cz } menuentry "Alt Linux 7.0.5 Simply rescue" { insmod loopback set gfxpayload=keep insmod gzio insmod part_msdos insmod ext2 insmod xfs set bootpart=uuid:603ef866-453a-4c27-9799-3f03e6c167de set isodir=/iso set isofile=altlinux-7.0.5-simply-x86_64-install-dvd5.iso loopback loop (${root})${isodir}/${isofile} linux (loop)/syslinux/alt0/vmlinuz lowmem automatic=method:disk,${bootpart},directory:${isodir}/${isofile} ramdisk_size=183210 fastboot stagename=rescue showopts initrd (loop)/syslinux/alt0/full.cz } Образ лежит в отдельном разделе /boot (ext2/3/4) UUID которого указан в скрипте, в папке /iso. Подставьте свои значения и будет вам щастие. Единственный момент - в режиме Live CD у меня не работала ВаФля.

среда, 25 декабря 2019 г.

Склонировать диск (в т.ч системный) в ISO

#net #windows #winapi #любой_язык #iso_образ


Позволит ли .NET стек создать что-то подобное?

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


Ответы

Ответ 1



Образ ISO - это простая посекторная копия диска (точнее, раздела, или "дорожки", применительно к CD), без сжатия и каких-либо служебных заголовков. Название произошло от файловой системы ISO-9660, которая была одной из первых файловых систем для CD, но фактически образ ISO может содержать любую файловую систему в зависимости от типа носителя: UDF для DVD, FAT для дискет, FAT32/NTFS для флешек и т.п. Чтобы создать такой образ, достаточно открыть диск на чтение и переписать все содержимое в файл, поэтому потребуется лишь несколько функций для работы с файлами из WinAPI. Да, конечно, это можно сделать в .NET. Создать образ CD-ROM или другого подобного незаписываемого носителя довольно просто: using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace ConsoleApplication1 { class Program { [DllImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool GetDiskFreeSpace(string lpRootPathName, out uint lpSectorsPerCluster, out uint lpBytesPerSector, out uint lpNumberOfFreeClusters, out uint lpTotalNumberOfClusters); const uint GENERIC_READ = 0x80000000; const uint FILE_SHARE_READ = 0x00000001; const uint FILE_SHARE_WRITE = 0x00000002; const uint OPEN_EXISTING = 3; const uint FILE_ATTRIBUTE_NORMAL = 0x00000080; [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern IntPtr CreateFile( [MarshalAs(UnmanagedType.LPTStr)] string filename, [MarshalAs(UnmanagedType.U4)] uint access, [MarshalAs(UnmanagedType.U4)] uint share, IntPtr securityAttributes, [MarshalAs(UnmanagedType.U4)] uint creationDisposition, [MarshalAs(UnmanagedType.U4)] uint flagsAndAttributes, IntPtr templateFile); [DllImport("kernel32.dll", SetLastError = true)] static extern bool ReadFile(IntPtr hFile, [Out] byte[] lpBuffer, uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, IntPtr lpOverlapped); [DllImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool CloseHandle(IntPtr hObject); static void CreateISO(string letter, string outfile) { byte[] buf; uint dwRead = 0; ulong count = 0; uint dwSectorsPerCluster, dwBytesPerSector, dwNumberOfFreeClusters, dwTotalNumberOfClusters; uint blocksize; ulong totalsize; const uint SECTOR_SIZE = 2048; //размер сектора для CD string fmt = "\\\\.\\{0}:"; //формат имени файла для открытия тома //найдем размер сектора и объем данных на диске bool res = GetDiskFreeSpace(letter + ":\\", out dwSectorsPerCluster, out dwBytesPerSector, out dwNumberOfFreeClusters, out dwTotalNumberOfClusters); //вычислим размер блока, кратный размеру сектора, и общий объем данных в байтах if (res) { blocksize = dwBytesPerSector * 20; totalsize = dwSectorsPerCluster * dwBytesPerSector * (ulong)dwTotalNumberOfClusters; } else { Console.WriteLine("GetDiskFreeSpace error {0}", Marshal.GetLastWin32Error()); blocksize = SECTOR_SIZE * 20; totalsize = 4700307456; //DVD } buf = new byte[blocksize]; string volume = String.Format(fmt, letter); //открываем том для прямого доступа на чтение var handle = CreateFile(volume, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero); if (handle.ToInt64() == -1) throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error()); //открываем файл для записи var target = new System.IO.FileStream(outfile, System.IO.FileMode.Create); try { while (true) { dwRead = 0; Array.Clear(buf, 0, buf.Length); //считаем блок данных res = ReadFile(handle, buf, blocksize, out dwRead, IntPtr.Zero); if (res == false) { Console.WriteLine(); Console.WriteLine("ReadFile error {0}", Marshal.GetLastWin32Error()); break; } if (dwRead == 0) break; //конец считывания count += dwRead; Console.Write(" Creating image: {0}% [{1} KB / {2} KB]\r", (count * 100.0f / totalsize).ToString("F1").PadLeft(5), (count / 1024.0f).ToString("F2").PadLeft(10), (totalsize / 1024.0f).ToString("F2").PadLeft(10)); //запишем блок в файл target.Write(buf, 0, (int)dwRead); } } finally { CloseHandle(handle); target.Close(); } Console.WriteLine(); } static void Main(string[] args) { CreateISO("E", "c:\\distr\\image.iso"); Console.ReadKey(); } } } Для создания образа записываемого носителя (флешки и т.п.), необходимо сначала попросить пользователя закрыть все программы, которые его используют, и открывать диск монопольно (0 вместо FILE_SHARE_READ | FILE_SHARE_WRITE). Если этого не сделать, во время создания образа часть информации на диске может быть параллельно изменена другой программой, и образ получится в итоге в некорректном состоянии. Альтернативное решение этой проблемы - использование Volume Shadow-Copy Services (VSS). Что касается жестких дисков, то создавать ISO-образ таким методом для них не выглядит хорошей идеей. Во-первых, открыть жесткий диск эксклюзивно не всегда получится (а системный и вовсе никогда). Во-вторых, формат ISO для них просто не предназначен, и многие утилиты вообще не смогут обработать ISO-образ для жесткого диска. Вместо этого лучше использовать специальный формат для образов жестких дисков, например VHD. Он поддерживается как средствами Windows, так и сторонними продуктами типа Акрониса. Опять же, для программного создания таких образов можно не изобретать что-то свое, а воспользоваться стандартной утилитой командной строки wbadmin, которая автоматически умеет использовать VSS и создавать образ в том числе системного диска.

воскресенье, 22 декабря 2019 г.

Монтирование iso образов дисков средствами .Net

#c_sharp #net #iso_образ


Есть ли в .Net средства для монтирования iso образов дисков?
    


Ответы

Ответ 1



В Windows 8/8.1/10 есть встроенная поддержка монтирования ISO, вызовом AttachVirtualDisk. Но из C# диск проще всего примонтировать вызовом Powershell (nuget package) - Mount-DiskImage using System.Management.Automation; namespace IsoMountTest { internal class Program { private static void Main(string[] args) { var isoPath = @"C:\Foo\bar.iso"; using (var ps = PowerShell.Create()) { ps.AddCommand("Mount-DiskImage").AddParameter("ImagePath", isoPath).Invoke(); } } } } en-SO: Is there any special API in Windows 8 to Mount ISO files?

Ответ 2



Реализовать монтирование дисков средствами .NET - нельзя (нужен драйвер, а драйвера на .NET не пишут). Но можно найти внешнюю программу и запустить ее, сказав ей примонтировать диск. Запускается внешняя программа обычно через Process.Start. Кстати, если просто "запустить" .iso-файл - то при установленной программе для монтирования образов есть неплохой шанс, что образ смонтируется.

Ответ 3



Для этого есть DiscUtils, есть IsoCreator, также есть IsoCS. Источники: enSO1, enSO2 и, как ни странно, гугл.

Ответ 4



Если монтирование ISO образа вам необходимо для чтения содержимого, то в монтировании нет нужды, потому что содержимое ISO файла можно прочитать так: using (FileStream isoStream = File.Open(@"C:\sample.iso")) { CDReader cd = new CDReader(isoStream, true); Stream fileStream = cd.OpenFile(@"Folder\Hello.txt", FileMode.Open); // ... } Этот код работает благодаря проекту DiscUtils, в котором существует поддержка ISO файлов, а также для виртуальных машин есть поддержка: VHD, VDI, XVA, VMDK и многих других. Страницы для скачивания DiscUtils: http://www.nuget.org/packages/Discutils/ http://discutils.codeplex.com/

воскресенье, 7 апреля 2019 г.

Как монтировать ISO-образы на Windows 7?

Многие крупные скачиваемые обновления поставляются в виде образов для болванок - файлов формата ISO. Прожигать диски, чтобы с них устанавливать обновления, - это пустая трата расходников, потому что после обновления диски уже не нужны - получается, что это диски однократного использования. Вопрос в том, как правильно монтировать образы в Windows, какие для этого существуют встроенные или устанавливаемые инструменты?


Ответ

Daemon tools (Lite-версия бесплатна), alcohol и множество других ,есть кстати и утилита от майкрософта, но не помню, как называется... Да и в конце концов можно просто открыть архиватором - 7-zip'ом, например. )

среда, 20 марта 2019 г.

Создать iso своей системы Ubuntu 11.10

Есть система, на которой установлено множество пакетов и произведено множество настроек. Как создать iso образ этой системы сохраняя все настройки? Пробовал remastersys, но никак не могу установить ее ни с репозиториев, ни с исходников. Вариант подобный "Suse Studio" для Ubuntu тоже рассматривается UPD: Для решения задачи подошла программа "relinux"


Ответ

Для клонирования Linux системы можно воспользоваться средствами MondoRescue. Они позволяют сохранить работающую систему на диск и восстановить систему с диска.

четверг, 29 ноября 2018 г.

Как установить AltLinux 7.0.5 из .iso при помощи GRUB2?

Что надо написать в конфиг grub2, чтобы загрузился дистрибутив AltLinux 7.0.5 ?
Понятно, что нужно указать loop для grub.
menuentry "AltLinux 7.0.5"{ insmod loopback # search --set --fs-uuid b316cbc2-4695-480c-b9b9-a555350d458a set isofile=/iso/altlinux-7.0.5-school-master-x86_64-ru-install-dvd5.iso loopback loop (${root})${isofile} linux (loop)/syslinux/alt0/vmlinuz iso-scan/filename=$isofile initrd (loop)/syslinux/alt0/full.cz }
Непонятно, какие параметры передавать в строке параметров ядра, так как для этого надо знать, как собирался full.cz (=initrd от altlinux) и какие параметры он понимает.
Такая загрузка совершенно точно возможна в Ubuntu, в Debian и в Fedora
вот такой же вопрос, только он там не отвечен: https://www.linux.org.ru/forum/linux-install/5934581 вот этот вопрос в виде обобщенном для любых дистрибутивов: Как загрузиться с iso? (отвечен на примере Ubuntu)
Этот вопрос социально значимый и глобального масштаба, так как флешки - это дополнительные материальные расходы, а возможность устанавливать без них увеличивает степень проникновения Linux в бедных регионах.


Ответ

menuentry "AltLinux 7.0.5, simply install" { set gfxpayload=keep insmod gzio insmod part_msdos insmod ext2 insmod xfs set bootpart=uuid:df46d821-e7f9-4e35-bbd2-728bdce8d89a set isodir=/iso/Alt705simple set isofile=altlinux-7.0.5-simply-x86_64-install-dvd5.iso loopback loop (${root})${isodir}/${isofile} linux (loop)/syslinux/alt0/vmlinuz automatic=method:disk,${bootpart},directory:${isodir}/${isofile} ramdisk_size=183210 changedisk lang=ru_RU splash noeject xdriver=auto quiet=1 showopts initrd (loop)/syslinux/alt0/full.cz }

вторник, 27 ноября 2018 г.

Склонировать диск (в т.ч системный) в ISO

Позволит ли .NET стек создать что-то подобное?
Или нужно или стоит пользоваться другими языками программирования и технологиями для решения поставленной задачи. Подозреваю что что-то вроде плюсов, ибо приходится работать наверняка с чем-то низко системным.


Ответ

Образ ISO - это простая посекторная копия диска (точнее, раздела, или "дорожки", применительно к CD), без сжатия и каких-либо служебных заголовков. Название произошло от файловой системы ISO-9660, которая была одной из первых файловых систем для CD, но фактически образ ISO может содержать любую файловую систему в зависимости от типа носителя: UDF для DVD, FAT для дискет, FAT32/NTFS для флешек и т.п. Чтобы создать такой образ, достаточно открыть диск на чтение и переписать все содержимое в файл, поэтому потребуется лишь несколько функций для работы с файлами из WinAPI. Да, конечно, это можно сделать в .NET.
Создать образ CD-ROM или другого подобного незаписываемого носителя довольно просто:
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices;
namespace ConsoleApplication1 { class Program { [DllImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool GetDiskFreeSpace(string lpRootPathName, out uint lpSectorsPerCluster, out uint lpBytesPerSector, out uint lpNumberOfFreeClusters, out uint lpTotalNumberOfClusters);
const uint GENERIC_READ = 0x80000000; const uint FILE_SHARE_READ = 0x00000001; const uint FILE_SHARE_WRITE = 0x00000002; const uint OPEN_EXISTING = 3; const uint FILE_ATTRIBUTE_NORMAL = 0x00000080;
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern IntPtr CreateFile( [MarshalAs(UnmanagedType.LPTStr)] string filename, [MarshalAs(UnmanagedType.U4)] uint access, [MarshalAs(UnmanagedType.U4)] uint share, IntPtr securityAttributes, [MarshalAs(UnmanagedType.U4)] uint creationDisposition, [MarshalAs(UnmanagedType.U4)] uint flagsAndAttributes, IntPtr templateFile);
[DllImport("kernel32.dll", SetLastError = true)] static extern bool ReadFile(IntPtr hFile, [Out] byte[] lpBuffer, uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, IntPtr lpOverlapped);
[DllImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool CloseHandle(IntPtr hObject);
static void CreateISO(string letter, string outfile) { byte[] buf; uint dwRead = 0; ulong count = 0; uint dwSectorsPerCluster, dwBytesPerSector, dwNumberOfFreeClusters, dwTotalNumberOfClusters; uint blocksize; ulong totalsize;
const uint SECTOR_SIZE = 2048; //размер сектора для CD string fmt = "\\\\.\\{0}:"; //формат имени файла для открытия тома
//найдем размер сектора и объем данных на диске bool res = GetDiskFreeSpace(letter + ":\\", out dwSectorsPerCluster, out dwBytesPerSector, out dwNumberOfFreeClusters, out dwTotalNumberOfClusters);
//вычислим размер блока, кратный размеру сектора, и общий объем данных в байтах if (res) { blocksize = dwBytesPerSector * 20; totalsize = dwSectorsPerCluster * dwBytesPerSector * (ulong)dwTotalNumberOfClusters; } else { Console.WriteLine("GetDiskFreeSpace error {0}", Marshal.GetLastWin32Error()); blocksize = SECTOR_SIZE * 20; totalsize = 4700307456; //DVD } buf = new byte[blocksize];
string volume = String.Format(fmt, letter);
//открываем том для прямого доступа на чтение var handle = CreateFile(volume, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero);
if (handle.ToInt64() == -1) throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());
//открываем файл для записи var target = new System.IO.FileStream(outfile, System.IO.FileMode.Create);
try { while (true) { dwRead = 0; Array.Clear(buf, 0, buf.Length);
//считаем блок данных res = ReadFile(handle, buf, blocksize, out dwRead, IntPtr.Zero); if (res == false) { Console.WriteLine(); Console.WriteLine("ReadFile error {0}", Marshal.GetLastWin32Error()); break; }
if (dwRead == 0) break; //конец считывания
count += dwRead;
Console.Write(" Creating image: {0}% [{1} KB / {2} KB]
", (count * 100.0f / totalsize).ToString("F1").PadLeft(5), (count / 1024.0f).ToString("F2").PadLeft(10), (totalsize / 1024.0f).ToString("F2").PadLeft(10));
//запишем блок в файл target.Write(buf, 0, (int)dwRead); }
} finally { CloseHandle(handle); target.Close(); }
Console.WriteLine(); }
static void Main(string[] args) { CreateISO("E", "c:\\distr\\image.iso"); Console.ReadKey(); } } }
Для создания образа записываемого носителя (флешки и т.п.), необходимо сначала попросить пользователя закрыть все программы, которые его используют, и открывать диск монопольно (0 вместо FILE_SHARE_READ | FILE_SHARE_WRITE). Если этого не сделать, во время создания образа часть информации на диске может быть параллельно изменена другой программой, и образ получится в итоге в некорректном состоянии. Альтернативное решение этой проблемы - использование Volume Shadow-Copy Services (VSS).
Что касается жестких дисков, то создавать ISO-образ таким методом для них не выглядит хорошей идеей. Во-первых, открыть жесткий диск эксклюзивно не всегда получится (а системный и вовсе никогда). Во-вторых, формат ISO для них просто не предназначен, и многие утилиты вообще не смогут обработать ISO-образ для жесткого диска. Вместо этого лучше использовать специальный формат для образов жестких дисков, например VHD. Он поддерживается как средствами Windows, так и сторонними продуктами типа Акрониса. Опять же, для программного создания таких образов можно не изобретать что-то свое, а воспользоваться стандартной утилитой командной строки wbadmin, которая автоматически умеет использовать VSS и создавать образ в том числе системного диска.

вторник, 13 ноября 2018 г.

Монтирование iso образов дисков средствами .Net

Есть ли в .Net средства для монтирования iso образов дисков?


Ответ

В Windows 8/8.1/10 есть встроенная поддержка монтирования ISO, вызовом AttachVirtualDisk
Но из C# диск проще всего примонтировать вызовом Powershell (nuget package) - Mount-DiskImage
using System.Management.Automation;
namespace IsoMountTest { internal class Program { private static void Main(string[] args) { var isoPath = @"C:\Foo\bar.iso"; using (var ps = PowerShell.Create()) { ps.AddCommand("Mount-DiskImage").AddParameter("ImagePath", isoPath).Invoke(); } } } }
en-SO: Is there any special API in Windows 8 to Mount ISO files?