Чтобы создать образ с несколькими разделами, решение, не требующее каких-либо изящных инструментов или корневого доступа, состоит в том, чтобы сначала создать файловые системы, а затем объединить их.
truncate -s $IMAGE_ROOTFS_ALIGNMENT disk
truncate -s $BOOT_SPACE_ALIGNED part1
mkfs.fat part1
cat part1 >>disk
truncate -s $ROOTFS_SIZE part2
mkfs.ext4 part2
cat part2 >>disk
Затем запустите parted
или fdisk
, чтобы создать разделы.
У этого подхода есть обратная сторона, заключающаяся в том, что результирующее изображение не будет разреженным.
ln -s ../src include/bb
либо создает ссылку с именем include/bb
, ссылающуюся на ../src
(относительно его расположения), либо создает файл include/bb/src
, ссылающийся на ../src
(относительно его расположения). Последнее имеет место, если include/bb
существует и является каталогом (фактически или как ссылка на каталог).
Таким образом, когда вы выполнили команду один раз, теперь существует ссылка include/bb
, которая указывает на каталог src
, родственный include
. То есть, include/bb
теперь является каталогом. Поэтому, когда вы выполняете команду в следующий раз, в этот каталог добавляется новая ссылка с именем src
.
Это не имеет никакого отношения к ;
.
Возможно, вы хотели использовать
ln -sTf ../src include/bb
вместо этого, чтобы (по -T
) сказать ln
рассматривать любой существующий include/bb
как обычный файл (даже если это ссылка, ссылающаяся на каталог), и (по -f
) заставить этот файл быть замененным.
При выполнении
ln -s ../src include/bb
ln -s ../src include/bb
первая строка делает ссылку include/bb
на каталог ../src
(что и ожидалось).
Второй обнаруживает, что include/bb
уже существует. Если бы это был обычный файл или симссылка на обычный файл, это было бы ошибкой (если только вы не указали -f
). Вместо этого, это симссылка на каталог ../src
, созданный в предыдущем шаге. Когда ln
в целевом операнде является каталогом:
утилита ln должна создать новую [...] символическую ссылку для каждого файла, указанного операндом
source_file
, на путь назначения в существующем каталоге, названномtarget_dir
.
Итак, на этот раз вы просите создать ссылку на ../src
внутри include/bb/
, которая является (ссылкой на) каталог. Эти ссылки по умолчанию именуются в соответствии с существующими базовыми именами, то есть src
в данном случае. Если вы запустите его в третий раз, то получите ошибку, потому что ../src/src
уже существует.
Вы можете избежать этого, удаляя ссылку include/bb
каждый раз перед этим с помощью rm include/bb
. Точка с запятой здесь не участвует.