summaryrefslogtreecommitdiff
path: root/LINUX/iso fs _ ISO9660.md
blob: 0ca6fa5a4f2070ab41ce66da98c1e1e8a6054b21 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Так, а чем по своей сути вообще является iso файл? Грубо говоря, это несжатый архив с точной копией данных блочного устройства **(hdd, ssd, cd)** в формате файловой системы **ISO9660**:

`file linuxmint-22.1-xfce-64bit.iso

linuxmint-22.1-xfce-64bit.iso: ISO 9660 CD-ROM filesystem data (DOS/MBR boot sector) ... (bootable)

В зависимости от содержимого образ может быть загрузочным и не загрузочным. Давайте из приведенного выше описания iso-шника выведем возможные способы работы с ним:
1) он представляет собой архив - его можно **распаковать**;
2) он содержит файловую систему ISO9660 - его можно **монтировать**;

Начнем с "**распакоуки**". Для этого можем воспользоваться утилитой **7z**:

`sudo apt install p7zip-full
$ 7z x linux*.iso -o./extract

После завершения процесса мы вольны вносить в файловую структуру свои коррективы. После правок нужно будет заново собрать установочный iso образ. Для этого есть утилитка **mkisofs**, которая корректно собирает **ISO9660** архивы из файлов и каталогов.

**Второй способ** - монтировать образ и скопировать его содержимое. 

В привычном для нас понимании, монтирование относится к блочным устройствам **(usb, ssd, hdd)**, которые содержат определенную файловую систему **(exFAT, ext, zfs)**. Такой механизм позволяет нам получить доступ к содержимому носителей.

Но вот в чем дело, **iso** файл не является **блочным устройством** и его нельзя просто так примонтировать... Ничего, есть решение - механизм **loop device**.

**Loop device** — это виртуальное блочное устройство, которое позволяет использовать обычный ресурс с файловой системой, как физический девайс. Через него можно смонтировать образ и получить доступ к его файловой системе. 

Посмотреть то, какое устройство с каким ресурсом соотносится, можно через команду **losetup**:

`sudo losetup -a

/dev/loop13: [64512]:2672215 (/path/to/output.iso)

Для того, чтобы создать и монтировать "**loop device**", используем **mount**:

$ sudo mount -o loop test.iso ./mnt_point

Теперь, т.к. файловая система **ISO9660** является "**read-only**", нам нужно скопировать все содержимое образа в отдельный каталог:

`mkdir new_mnt_point

`cp -rT mnt_point new_mnt_point

Далее "по уму" редактируем образ и пересобираем его с помощью **mkisofs**:

`sudo mkisofs -o ./new.iso -quiet -R -b boot/grub/bios.img -no-emul-boot -boot-load-size 4 -boot-info-table ./new_mnt_point

Если все сделано правильно, на выходе мы получим "**bootable**" образ.