2

У нас есть сценарий процесса, который создает встроенную установку Debian Jesse на SD-карту. Соответствующие части скрипта выглядят так:

export DISK=/dev/sdb
umount ${DISK}1   # make sure no partitions mounted at the moment
umount ${DISK}2   # ditto
dd if=/dev/zero of=${DISK} bs=1M count=16   # zero partition table zone, overkill
sfdisk --in-order --Linux --unit M ${DISK} <<-__EOF__    # make partitions
    1,48,0xE,*
    ,,,-
__EOF__

mkfs.vfat -F 16 ${DISK}1 -n boot    # install file systems
mkfs.ext4 ${DISK}2 -L rootfs

После этого, кажется, включается автоматический монтирование и перемонтируется SD-карта, поэтому мы можем делать такие вещи, как:

cp -v ${DIR}/u-boot/spl/u-boot-spl.bin /media/$username/boot/BOOT.BIN
cp -v ${DIR}/u-boot/u-boot.img /media/$username/boot/
cp -v ${DIR}/u-boot/uEnv.txt /media/$username/boot/
rsync -axHAX --progress ${DIR}/jessieRoot/ /media/$username/rootfs/

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

ПРОБЛЕМА с этим имеет два аспекта: 1) Это прямо сейчас связано с Ubuntu/ машиной (предполагается, что карта находится в sdb и т.д. 2) Она нуждается в реальной карте, поэтому не поддается сборочной машине.

Есть ли способ сделать вышеупомянутое без карты?

Я попытался с помощью dd просто сделать файл 8G, а затем запустил sfdisk (все это файл, верно?) и эта часть сработала. Но не ясно, как я запускаю части mkfs для работы, они, похоже, хотят работать с файлами блочных устройств, а не с субрегионами одного файла, в который встроена таблица разделов. И тогда у меня есть проблема его монтажа. Я предполагаю, что использую какое-то заклинание цикла mount -o loop , но опять же, не уверенный, как это сделать в подобласти файла виртуального образа, я всегда просто опускаю это с файлами .iso.

(Не стесняйтесь быть педантичным, я не эксперт (очевидно) с такими вещами. Я получаю некоторые из них, а другие части кажутся немного волшебными ...)

1 ответ1

4

Я думаю, что на этой странице есть все, что вам нужно.

  • вместо SDB использовать петлевые устройства

  • вместо реальной карты используйте виртуальную файловую систему

  • вы находитесь на правильном пути, используя dd для создания файла для виртуальной файловой системы.

  • Вы находитесь на правильном пути, используя петлевое устройство. Хитрость заключается в установке петлевого устройства в смещениях, где находятся перегородки.

Это статья.

Виртуальная файловая система - это файловая система, которая существует в файле, который, в свою очередь, существует на физическом диске. Есть много замечательных вещей, которые вы можете сделать с виртуальными файловыми системами; причина, по которой я возился с ними, была в том, чтобы настроить виртуальную машину на хосте linux. Другое использование включает шифрование файловых систем без шифрования целых дисков; File Vault в Mac OS X шифрует домашние каталоги пользователей таким образом. Может быть, вы сделали себе один гигантский раздел, а затем по той или иной причине поняли, что вам нужно несколько разделов! Виртуальные файловые системы также могут (в некоторой степени) помочь с этим.

Итак, как вы делаете виртуальную файловую систему? Легко. Первое, что вам нужно сделать, это создать файл для файловой системы. Это где "дд" начинает входить. Рассмотрим, например, следующую команду:

дд если =/dev/zero of = ~/myFileSystem.img bs = 1024 count = 1048576

Эта команда будет читать 1,048,576 блоков из /dev/zero и записывать их в ~/myFileSystem.img; каждый блок занимает 1024 байта, в результате получается файл размером 1 гигабайт, содержащий все нули. Фактические значения, которые вы используете для размера блока (bs) и счетчика, на самом деле не важны, ключ к правильной математике: bs * count = imageSize.

Итак, теперь у вас есть файл; отличный. Пришло время сделать файловую систему! эта часть еще проще ... мы создадим файловую систему EXT2, используя следующую команду:

mke2fs myFileSystem.img

Вы можете заметить предупреждение, в котором говорится, что myFileSystem.img не является блочным устройством, хотите продолжить? Мы доберемся до этого всего за секунду, а пока, скажем да. Все должно пройти гладко, это будет выглядеть так, как если бы вы создали файловую систему на реальном диске. Теперь у вас есть виртуальная файловая система! Осталось только смонтировать вашу файловую систему, чтобы вы могли получить к ней доступ ...

mkdir /mnt /virtual

mount -o loop ~/myFileSystem.img /mnt /virtual

Теперь любой файл, который вы помещаете в /mnt /virtual, фактически помещается непосредственно в myFileSystem.img! Разве это не было легко?

Фантастика. Теперь, когда вы знаете, как создать виртуальный файловый файл, почему бы не создать на некоторое время образ виртуального диска? Какую разницу вы спрашиваете? Образ диска будет иметь таблицу разделов, которая определяет некоторое количество разделов, и каждый раздел содержит свою собственную файловую систему; таким образом, виртуальная файловая система по сути является "виртуальным разделом" образа виртуального диска; образ виртуального диска содержит несколько виртуальных файловых систем и таблицу виртуальных разделов, которая описывает границы каждого раздела.

Создание образа виртуального диска начинается так же; Первое, что вам нужно, это большой пустой файл, только что созданный вами выше. На этот раз, однако, вместо создания файловой системы, мы хотим разделить файл с помощью fdisk. Чтобы сделать вещи немного лучше, мы собираемся добавить петлевые устройства в микс. Вы должны убедиться, что в вашем ядре включена поддержка устройств loopback (большинство дистрибутивов делают это по умолчанию; но если вы собираете ядро linux junky, вы можете захотеть проверить). Поэтому мы создадим большой файл и прикрепим его к устройству с обратной связью следующим образом:

дд если =/dev/zero = =/myDisk.img bs = 1024 count = 1048576

losttup /dev/loop0 ~/myDisk.img

Прикрепив образ диска к устройству обратной связи, мы можем использовать /dev/loop0 так же, как мы использовали бы ~/myDisk.img; Основное отличие состоит в том, что /dev/loop0 - это то, что называется "блочным устройством". Вы должны спросить кого-то с большим опытом, чем у меня, что именно это дает вам, но я знаю, что утилиты файловой системы работают лучше с блочными устройствами, чем с плоскими файлами. Плюс это весело.

Итак, у нас есть большой пустой файл, прикрепленный к устройству обратной связи (/dev/loop0) ... теперь пришло время создать разделы в образе диска. Для этого мы запустим fdisk на нашем устройстве loopback:

fdisk /dev/loop0

Давайте создадим три раздела ... если вы следите за этим, вы уже должны быть знакомы с fdisk, поэтому продолжайте и создайте следующее: Device Boot Start End Blocks Id System

/dev/loop0p1 1 17 136521 83 Linux

/dev/loop0p2 18 80 506047+ 82 Linux swap

/dev/loop0p3 81 130 401625 83 Linux

После того, как вы сделали свои разделы, напишите свои изменения и выйдите из fdisk. Далее нам нужно создать файловые системы на каждом разделе. Помните, как легко это было с виртуальными файловыми системами? Уже не так много ...

Однако, чтобы не паниковать ... проблема в том, что "mkfs" не может "добраться до" нашего образа виртуального диска и создать файловую систему только на отдельном разделе. На самом деле, если вы попробуете, вы, вероятно, закончите стирать образ вашего виртуального диска и перезапустите fdisk. Так что же делать ... что делать ?? Петлевые устройства на помощь. Что мы сделаем, так это подключим петлевое устройство к файлу myDisk.img с определенными смещениями, с которых начинается каждый раздел.

Тогда полезно взглянуть на разделы с точки зрения блоков. Выполните следующую команду:

fdisk -ul /dev/loop0

должен выглядеть (надеюсь, точно) так:

Диск /dev/loop0: 1073 МБ, 1073741824 байта

255 головок, 63 сектора / дорожка, 130 цилиндров, всего 2097152 сектора

Единицы = секторы 1 * 512 = 512 байт

  Device Boot      Start         End      Blocks   Id  System

/dev/loop0p1 63 273104 136521 83 Linux

/dev/loop0p2 273105 1285199 506047+ 82 Linux swap

/dev/loop0p3 1285200 2088449 401625 83 Linux

Эти числа важны для математики ... мы будем использовать команду losttup, как и раньше, только в этот раз мы дойдем до начала каждого из трех разделов. losttup принимает смещения как количество пропущенных байтов в начале файла. Вывод fdisk -ul /dev/loop0 показывает нам, что первый раздел начинается в блоке 63, и каждый блок занимает 512 байтов. Итак, раздел 1 начинается с байта 32,256

losttup -o 32256 /dev/loop1 /dev/loop0

Эта команда достигает 32 256 байтов в /dev/loop0 и монтирует ее в /dev/loop1. Помните, что поскольку /dev/loop0 прикреплен к файлу myDisk.img, это равносильно достижению 32 256 байтов в этом файле ... следовать? Хорошо. Та же логика для разделов 2 и 3:

losttup -o 139829760 /dev/loop2 /dev/loop0

losttup -o 658022400 /dev/loop3 /dev/loop0

Итак, теперь у нас установлено четыре петлевых устройства; /dev/loop0 прикреплен к файлу myDisk.img. /dev/loop1 - это первый раздел виртуального диска, представленный как /dev/loop0; /dev/loop2 - это 2_nd, а /dev/loop3 - это 3_rd.

Теперь пришло время создавать эти файловые системы! Теперь это так же просто, как создать обычную файловую систему, поскольку это все, что мы делаем. Помните, mkfs не знает, что устройство не является физическим устройством! Мы сделаем три вида файловых систем, файловую систему ext2 для раздела 1, файловую систему подкачки для раздела 2 и файловую систему XFS для раздела 3:

mkfs /dev/loop1

mkswap /dev/loop2

mkfs.xfs /dev/loop3

Поскольку loop1, loop2 и loop3 напрямую связаны с loop0, а loop0 - это ~/myDisk.img, все, что мы только что сделали с loop1, loop2 и loop3, напрямую влияло на myDisk.img! Теперь мы можем смонтировать /dev/loop3, например, в /mnt /virtual как файловую систему XFS, и использовать ее как обычную файловую систему!

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .