Гостевые дополнения Virtualbox на хосте Ubuntu и госте Manjaro

Это просто, потому что подоболочка оценивается из вашей текущей оболочки, а не из вашей подоболочки. Экранирование $ () заставит его работать так, как вы ожидали:

/bin/bash -c "\
A=/tmp/foo; \
echo \$( touch \$A;  ); \
echo \$( echo in subshell, \$A; ); \
"
4
17.06.2019, 12:14
4 ответа

ИМХО это все кажется слишком сложным. Когда tar кажется очевидным решением. tar может создать практически любую файловую систему, включая cdfs (--options cd9660 :*). Это также позволит вам поставить отметку времени выходного файла на любой из самых последних -m || --modification-time, --gid id || --gname name, --acls || --no-acls, --same-owner || --no-same-owner,...

.

Или вы можете создать свою файловую систему. Выполните chown -Rh someone:somegroup.в вашем файловом дереве и chmodего по своему вкусу и используйте либо tar, либо rsync , чтобы поместить файловое дерево в вашу подготовленную файловую систему. Тогда все будет последовательно --та же дата, тот же владелец/группа и права.

Вот как бы я подошел к чему-то подобному.:)

ХТХ

3
27.01.2020, 20:53

Примечание.:Это не будет полным ответом; только частичный или, по крайней мере, намек


I need to be able to run my script that creates the image and have the output be bit-for-bit identical each time.

Первая проблема, которую необходимо решить, это disk signaturesв ваших msdosтаблицах разделов (смещение 440 в MBR , длиной 4 байта). Если ваши MBR отличаются, вы не достигаете своей цели только в первом секторе. Каждый раз, когда вы выполняете mklabelвнутри parted, вы создаете новый disk signature. Вы можете преодолеть это, перезаписав эти четыре байта одной и той же случайной подписью, например:

printf RAMDOM_SIGNATURE | xxd -p -r | dd bs=1 count=4 seek=440 of=YOUR_DOT_BIN conv=notrunc 2> /dev/null

RANDOM_SIGNATUREможет быть что-то вроде'73396992'

Я сделал небольшой мод для вашего скрипта с этим исправлением:

dd if=/dev/zero bs=1024 count=46112 of="$1"
parted "$1" <<EOF
unit
s
mklabel
msdos
mkpart
p
ext2
63s
45119s
set
1
boot
on
q
EOF

printf "$2" | xxd -p -r | dd bs=1 count=4 seek=440 of="$1" conv=notrunc 2> /dev/null

losetup -o $(expr 63 \* 512) /dev/loop0 "$1"

mke2fs -b 1024 -t ext2 /dev/loop0 22528

#clear some parameters
tune2fs -i 0 /dev/loop0 # interval between check
tune2fs -L LABEL /dev/loop0
tune2fs -U 00000000-0000-0000-0000-000000000000 /dev/loop0 #uuid
tune2fs -c 0 /dev/loop0 #mount count

#mount /dev/loop0 mnt
## make a dummy file
#echo HELLO > mnt/a.txt
#umount mnt

losetup -d /dev/loop0

Теперь вы можете вызвать скрипт следующим образом

./script_name BIN_FILE_NAME RANDOM_SIGNATURE

Теперь, если вы сделаете это:

./test.sh cf00.bin '73396992'
./test.sh cf01.bin '73396992'
./test.sh cf02.bin '73396992'
./test.sh cf03.bin '73396992'

и вот это:

dd if=cf00.bin count=63 2>/dev/null | sha1sum
dd if=cf01.bin count=63 2>/dev/null | sha1sum
dd if=cf02.bin count=63 2>/dev/null | sha1sum
dd if=cf03.bin count=63 2>/dev/null | sha1sum

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

Вы, наверное, заметили, что в моей версии скрипта я закомментировал строки, записывающие файл a.txt. Я сделал это, потому что нет смысла пытаться исправить это, когда вы не можете сделать файловые системы идентичными, даже если на них нет файлов. И в этом случае :файловые системы различаются даже без файлов, так что, во-первых, нам нужно это исправить.

Если запустить dumpe2fsдля раздела файловой системы каждого образа, выгрузить его в файл, а затем использовать diffдля любой пары дампов, вы увидите что-то вроде этого:

25c25
< Filesystem created:       Sat Jun 15 07:37:32 2019
---
> Filesystem created:       Sat Jun 15 07:37:40 2019
27c27
< Last write time:          Sat Jun 15 07:37:33 2019
---
> Last write time:          Sat Jun 15 07:37:40 2019
30c30
< Last checked:             Sat Jun 15 07:37:32 2019
---
> Last checked:             Sat Jun 15 07:37:40 2019
37c37
< Directory Hash Seed:      603130ae-82de-4530-9772-f68ae3d6df5f
---
> Directory Hash Seed:      1d9c5af8-a48e-4221-9e70-8fa2ccc6936f

Итак, по крайней мере, на очень высоком уровне(после этого вам нужно пойти глубже, на самом низком уровне, т.е. :фактическое побайтовое сравнение )файловые системы различаются деталями, показанными чуть выше. Сначала обойдите это.

Даже если вы измените дату в машине,вам не удастся изменить метки времени и сделать их равными, потому что есть промежутки времени, которые вы можете контролировать при выполнении программы. В этом случае вам нужно заморозить ваши часы, по крайней мере, из программы, создающей перспективу файловой системы. Вы можете покопаться в этом, но я думаю, что это не выход, потому что вы сказали, что им нужно выполнить ваш скрипт на своих машинах:вы не хотите возиться с их часами . Итак, ИМХО, выход, вероятно, заключается в изменении правильных байтов в файловой системе, как я сделал с disk signature. Ищите вокруг этого.

Кроме того, не забудьте Superblock backups... выследить их. Если они содержат разные данные в каждой файловой системе, они будут распространять различия в диапазоне байтов, в котором они находятся.

Наконец, не забывайте, что когда вы копируете файл, вы не имеете прямого контроля над «распределением» байтов файла внутри файловой системы... Если вы не можете клонировать, вам нужно найти способ контролировать и это.

1
27.01.2020, 20:53

Вы также можете попробоватьe2image:

The e2image program will save critical ext2, ext3, or ext4 filesystem metadata located on device to a file.

Несмотря на то, что по умолчанию e2imageсохраняет только метаданные, он также может сохранять данные, используя опцию -a. (См. раздел «Включая данные» по ссылке)

The -a option can be specified to include all data. This will give an image that is suitable to use to clone the entire FS or for backup purposes. Note that this option only works with the raw or QCOW2 formats.

Формат QCOW2 предпочтительнее для резервного копирования, чем исходный формат. Образ QCOW2 представляет собой обычный файл, размер которого близок к используемому пространству раздела для резервного копирования. Необработанное изображение — это разреженный файл со всеми последствиями -Инструменты, которые не обрабатывают разреженные файлы, будут обрабатывать не только используемое пространство, но и свободное пространство.

Итак, примеры использования::

  • Резервное копирование sda1раздела, включая файлы и метаданные, в файлboot-part.qcow2:
sudo mount -o remount,ro /dev/sda1
sudo e2image -a -Q /dev/sda1 boot-part.qcow2

Обратите внимание, что перемонтирование только для чтения -требуется, чтобы гарантировать, что никто не будет выполнять запись в раздел во время выполнения резервного копирования. В конце концов, вы можете перемонтировать как чтение -запись по sudo mount -o remount,rw /dev/sda1, если вам нужно.

  • Восстановить раздел /dev/sda1из файла образа QCOW2boot-part.qcow2:
sudo umount /dev/sda1
sudo e2image -r boot-part.qcow2 /dev/sda1

Обратите внимание, что umountявляется обязательным, поскольку вы не можете перезаписывать суперблоки смонтированного раздела. Если /dev/sda1не смонтирован в этот раз, вы можете пропустить этот шаг.:)

Также стоит отметить, что при восстановлении сценария размер /dev/sda1должен быть равен или больше размера раздела внутри файла образа, иначе вы получите ошибку:e2image: Invalid argument while trying to convert qcow2 image (boot-part.qcow2) into raw image (/dev/sda1).

1
27.01.2020, 20:53

Ответом на ваш первоначальный вопрос является инструмент под названием genext2fs . Если вы поставите переключатель -f, то он создаст бит -на -бит идентичный выход, учитывая тот же вход. Это подтверждается либо его собственным набором тестов -, который сравнивает созданные изображения с предварительно -вычисленной суммой md5 правильного вывода, либо этим тестом (, выполняемым внутри исходного каталога ):

.
$./genext2fs -f -B 1024 -b 40 -d m4 rootfs.img
$ md5sum rootfs.img
322053a8962acc599eaabb2dfde28783  rootfs.img
$ rm rootfs.img
$./genext2fs -f -B 1024 -b 40 -d m4 rootfs.img
$ md5sum rootfs.img
322053a8962acc599eaabb2dfde28783  rootfs.img

Вы можете смонтировать полученный образ и убедиться, что его содержимое действительно совпадает с упакованным каталогом:

$ sudo mount rootfs.img /mnt
$ ls -lha /mnt
total 27K
drwxr-xr-x  3 root  root  1.0K Jan  1  1970.
drwxr-xr-x 25 root  root  4.0K Mar 22 14:56..
-rw-r--r--  1 josch josch 1.5K Mar 22 23:05 ac_func_scanf_can_malloc.m4
-rw-r--r--  1 josch josch 2.4K Mar 22 14:24 ac_func_snprintf.m4
drwx------  2 root  root   16K Jan  1  1970 lost+found
$ rmdir /mnt/lost+found
$ diff -rq m4 /mnt
$ echo $?
0

Веселитесь!

1
23.03.2020, 09:44

Теги

Похожие вопросы