Создайте цикл в файловой системе Linux
-
06-09-2019 - |
Вопрос
Как мне создать цикл в файловой системе Linux?Я хочу сломать свойство directed acyclic graph (DAG) файловой системы Linux.Возможно ли это?Я видел это состояние однажды, когда устанавливал кросс-компилятор scratchbox на свой Ubuntu.
Я не знаю, как воспроизвести это сейчас.
Решение
Некоторые другие респонденты уже ответили, как настроить монтирование с помощью устройства обратной связи, но вы специально спросили о bind
крепления, которые немного отличаются.Если вы хотите использовать привязку монтирования, вы просто указываете --bind
в команде mount (монтировать).Например:
mount --bind /original/path /new/path
Это сделает расположение файловой системы доступным по адресу /original/path
также доступный через /new/path
.Обратите внимание, что это приведет не следующие точки монтирования!Например, предположим, у меня есть следующие точки монтирования:
/something
/something/underneath/that
Теперь предположим, что я сделаю bind
крепление для /something
:
mount --bind /something /new_something
Я смогу получить доступ к таким файлам, как /something/myfile
по тропинке /new_something/myfile
.Но я сделаю это не иметь возможность доступа к файлам, таким как /something/underneath/that/otherfile
по тропинке /new_something/underneath/that/otherfile
.Вы должны настроить отдельный bind
монтирование для каждой файловой системы;или, если у вас относительно новое ядро, вы можете использовать rbind
крепления, которые делай следуйте точкам монтирования:
mount --rbind /something /new_something
Одно предостережение по поводу rbind
монтирует:они не обрабатывают случай, когда файловая система монтируется после rbind
это настройка.То есть, предположим, у меня есть такое крепление, как это:
/something
Затем я настроил свой rbind
как указано выше, и тогда Я взбираюсь на /something/underneath/that
:в rbind
волшебным образом не сделает новое крепление видимым через rbind
Расположение.Также имейте в виду, что, по-видимому, из-за ошибки в ядре вы не можете размонтировать rbind
монтируйся.
Кроме того, на всякий случай вы имели в виду "Как мне настроить привязку монтирования с помощью системного вызова mount(2)?":вы должны указать MS_BIND
флаг (определенный в mount.h
) когда ты позвонишь mount(2)
для постоянного bind
монтируйся.Для rbind
монтировать, вы должны указать MS_BIND
и недокумент MS_REC
флаг (определенный в linux/fs.h
).
Надеюсь, это поможет,
Эрик Мельски
Другие советы
Похоже, что все ответы на данный момент касаются монтажа на устройствах с обратной связью, а не создания цикла с использованием привязать крепления.
Как вы, вероятно, уже обнаружили,
$ mkdir -p test/test
$ mount --bind test test/test
только позволяет вам получить доступ test/test/test
, и не более того.Даже не
$ mount --rbind test test/test
работает, потому что рекурсивный метод привязки-монтирования эффективно выполняет поиск существующих монтировок в исходном коде и привязку их к целевому.
То, о чем вы просили, невозможно, поскольку привязки не пересекают точки монтирования.Если вы действительно хотите имитировать цикл файловой системы, попробуйте использовать монтирование с псевдосвязью, например локальные файлы.Я сам не пробовал, он может заблокироваться при попытке прочитать файловую систему, предоставленную самим собой.Только что я попробовал экспортировать дерево NFS с crossmnt
и монтирует его под себя, но выходит из строя по тем же причинам.
mount /path/to/device /path/to/mount/location -o loop
где /path/to/device - это путь либо к разделу, который вы хотите смонтировать, либо к образу диска, а /path/to/mount/location - это путь к папке, в которую вы хотите смонтировать устройство / образ
вам также может потребоваться указать тип файловой системы, подобный so (которая использует fat16 / fat32):
mount /path/to/device /path/to/mount/location -o loop -t vfat
Вы также можете захотеть создать его с нуля:
Сначала создайте файл изображения и инициализируйте его
dd if=/dev/zero of=/tmp/loop.img bs=1024k count=$IMG_SIZE
Затем сделайте его допустимым разделом, используя тип FS по вашему выбору
mkfs.ext3 -F /tmp/loop.img
Смонтируйте свой новый образ
mkdir -p /mnt/image
mount /tmp/loop.img /mnt/image -o loop
Теперь вы можете создавать / копировать файлы и каталоги в вашем новом изображении.
Получайте удовольствие,
Джич!