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

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

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 , чтобы создать разделы.

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

3
04.03.2016, 11:15
2 ответа
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) заставить этот файл быть замененным.

7
27.01.2020, 21:11

При выполнении

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. Точка с запятой здесь не участвует.

1
27.01.2020, 21:11

Теги

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