Intereting Posts
Программное обеспечение для навигации по сетевой диаграмме Не расширяйте отображение командной строки (cmap), пока не нажмете enter в vim Электронная почта, уклоняющаяся от моего спам-фильтра как включить командную историю оболочки Автозаполнение слов из буферного терминала Удаление дисков с большим количеством крошечных файлов на Lustre Как выполнить программу в gnome и заставить ее использовать другую тему gtk, отличную от стандартной? Установите конкретный 32-битный пакет на 64-битное debian squeeze (6.0) sudo: «эффективный uid не равен 0, sudo установлен setuid root?» на малине Pi Есть ли способ идентифицировать путь приложения для процесса, который пытается получить доступ к Интернету в дистрибутиве Linux? Как grep две строки из lshw? искать и заменять номера в vim Персонализируйте вывод сенсора и сохраните его в файл Пользовательские настройки не сохранены в браузере Nemo в Linux Mint 14 Cinnamon edition Как настроить обои с двумя мониторами (Ubuntu / NVIDIA)?

Почему я не могу создать «hardlink» для файла из каталога «mount -bind» в той же файловой системе?

Исходная проблема

У меня есть файл в одной файловой системе: /data/src/file

и я хочу жестко связать его с: /home/user/proj/src/file

но /home находится на одном диске, и /data находятся на другом, поэтому я получаю сообщение об ошибке:

 $ cd /home/user/proj/src $ ln /data/src/file . ln: failed to create hard link './file' => '/data/src/file': Invalid cross-device link 

Хорошо, поэтому я узнал, что не могу жестко связать устройства. Имеет смысл.

Проблема под рукой

Поэтому я подумал, что мне понравится и привязать монтирующую папку src находящуюся в /data файловой системе данных:

 $ mkdir -p /data/other/src $ cd /home/user/proj $ sudo mount --bind /data/other/src src/ $ cd src $ # (now we're technically on `/data`'s file system, right?) $ ln /data/src/file . ln: failed to create hard link './file' => '/data/src/file': Invalid cross-device link 

Почему это все еще не работает?

Временное решение

Я знаю, что у меня есть эта настройка правильно, потому что я могу сделать жесткую ссылку, пока я вхожу в «реальный» каталог /data а не в связанный.

 $ cd /data/other/src $ ln /data/src/file . $ # OK $ cd /home/user/proj/src $ ls -lh total 35M -rw------- 2 user user 35M Jul 17 22:22 file $ 

Некоторая информация о системе

 $ uname -a Linux <host> 4.10.0-24-generic #28-Ubuntu SMP Wed Jun 14 08:14:34 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux $ findmnt . . . ├─/home /dev/sdb8 ext4 rw,relatime,data=ordered │ └─/home/usr/proj/src /dev/sda2[/other/src] │ ext4 rw,relatime,data=ordered └─/data /dev/sda2 ext4 rw,relatime,data=ordered $ mountpoint -d /data 8:2 $ mountpoint -d /home/usr/proj/src/ 8:2 

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

В коде есть неутешительное отсутствие комментариев. Как будто никто никогда не думал, что это полезно, так как привязки привязки времени были реализованы в версии 2.4. Конечно, все, что вам нужно сделать, это заменить .mnt->mnt_sb где говорится .mnt

Потому что это дает вам границу безопасности вокруг поддерева.

PS: это обсуждалось довольно много раз, но чтобы избежать поиска: например, mount –bind / tmp / tmp; теперь у вас есть ситуация, когда пользователи не могут создавать ссылки в другом месте без root fs, даже если у них есть / tmp для записи. Подобная техника работает для других потребностей изоляции – в основном, вы можете ограничить переименование / ссылку на заданное поддерево. IOW, это преднамеренная функция. Обратите внимание: вы можете привязать кучу деревьев к chroot и получить предсказуемые ограничения независимо от того, как материал может быть перегруппирован через год в главном дереве и т. Д.

– Аль Виро

Ниже приведен конкретный пример вниз по потоку

Всякий раз, когда мы получаем правильную работу mount -r -bind (которую я использую для размещения копий необходимых разделяемых библиотек внутри chroot-jails при разрешении совместного использования кеша страниц), эта функция может сломать безопасность.

 mkdir /usr/lib/libs.jail for i in $LIST_OF_LIBRARIES; do ln /usr/lib/$i /usr/lib/libs.jail/$i done mount -r /usr/lib/libs.jail /jail/lib chown prisoner /usr/log/jail mount /usr/log/jail /jail/usr/log chrootuid /jail prisoner /bin/untrusted & 

Хотя защиты должно быть достаточно, но я бы предпочел избегать ссылки заключенного /jail/lib/libfoo.so (запись возвращает EROFS) в / jail / usr / log, где она потенциально может быть записана.

Причина, по которой вы не можете использовать межсетевое соединение, – это то, что вы вводите неоднозначность. Запись каталога для файла содержит (в простых системах) номер i-узла для соответствующего файла. Жесткая ссылка (только другая запись каталога) также должна содержать тот же номер i-узла. Это хорошо, но номера i-узлов уникальны только в одной файловой системе (они обычно представляют собой плотное множество, начинающееся с 1).

Ваша консоль привязки не устраняет эту проблему. Да, он создает своего рода «фикцию» структуры, но то, чего она не делает, это перечислить все i-узлы в одной файловой системе, чтобы убедиться, что они уникальны для обеих файловых систем! Это было бы глупо.

Это ограничение всегда присутствовало в UNIX-системах. Символическая ссылка была изобретена частично, чтобы решить эту проблему. Я знаю, что они функционально не то же самое, но они, как правило, в порядке.

Попробуйте символическую ссылку? ( ln -s )