Вопрос или проблема
В Linux есть ли способ получить доступ к файлам на смонтированной файловой системе, «замаскированных» после монтирования другой файловой системы поверх подкартотеки?
Например:
cd /
mkdir /foo
touch /foo/bar
mount /dev/sda1 /foo
# теперь, могу ли я всё ещё получить доступ к /foo/bar на / файловой системе?
Решение моей мечты не потребует повышенных разрешений или специфики для определённой файловой системы, но я приму любое решение, не создающее риск повреждения файловой системы.
Вы можете использовать команду mount для доступа к подлежащей файловой системе.
$ mkdir /mnt/root
$ sudo mount --bind / /mnt/root
$ cat /mnt/root/foo/bar
Это не создает проблем с повреждением, но требует разрешений для монтирования файловой системы.
Если у вас есть root, вы можете mount --move
переместить смонтированную файловую систему в временный каталог, а затем вернуть её обратно.
mkdir /bar
mount --move /foo /bar
Имея root, вы также можете прямо получить доступ к подлежащим блочным устройствам, если они есть. Для ext4 можно использовать debugfs
для экспорта файлов.
Доступ только на чтение никогда не сможет повредить файловую систему.
Каталоги могут иметь дескрипторы, или файловые дескрипторы, полученные для них. «Текущий каталог» тоже является дескриптором, а не путем. Если у вас есть дескриптор каталога, вы можете получать доступ к файлам внутри, даже если это место было замонтировано поверх него. Это не требует специальных привилегий, только специальной подготовки.
Я знаю, что этот вопрос старый, но он первым появляется в Google. Есть другой способ доступа к «скрытой» файловой системе, используя отдельный unshare. Он создает отдельное пространство имен с разными монтированиями и запускает что-то в этом пространстве. (Также его можно сделать постоянным – смотрите в manpage.)
mkdir /tmp/above /tmp/below
touch /tmp/above/a /tmp/below/b
mount -o bind /tmp/above /tmp/below
ls below
unshare --mount sh -c 'umount /tmp/below ; ls /tmp/below'
Первая команда ls
увидит ‘a’, а вторая увидит ‘b’.
Она требует повышенных разрешений, но должна работать с любой файловой системой.
.
Ответ или решение
Вопрос о доступе к файлам, "заслонённым" монтированием в среде Linux, является технической задачей, которая затрагивает архитектуру и управление файловыми системами. Когда вы монтируете новую файловую систему на подкаталог, это "заслоняет" файлы, которые находились там ранее. Задача заключается в том, чтобы всё же иметь доступ к этим "исчезнувшим" файлам. Давайте рассмотрим теоретический аспект, примеры и практическую часть решения этой задачи.
Теория
В операционной системе Linux файловая система рассматривается как совокупность каталогов и файлов, представляемых в виде иерархического дерева. Монтирование позволяет интегрировать одну файловую систему в другую, что делает её доступной по определенному пути. Однако, если вы монтируете новую файловую систему в существующий каталог, все файлы и подкаталоги в этом каталоге становятся невидимыми, пока файловая система смонтирована. Это происходит потому, что новая файловая система "перекрывает" старую, фактически делая её недоступной обычными средствами.
Примеры
-
Использование
mount --bind
: Один из способов получить доступ к засолённым файлам — это создание каталога другого уровня и использованиеmount --bind
, что позволяет перемонтировать дерево каталогов по другому пути. Например:mkdir /mnt/root sudo mount --bind / /mnt/root ls /mnt/root/foo/bar
В данном случае, сам корневой каталог
/
монтируется в/mnt/root
, что предоставляет доступ ко всем исходным файлам независимо от монтирования дополнительных файловых систем. -
Перемещение монтированной файловой системы: Альтернативный подход заключается в временном перемещении монтированной файловой системы:
mkdir /bar sudo mount --move /foo /bar
После этого вы можете получить доступ к файлам в
/foo
, пока новая точка монтирования находится в/bar
. Затем вы можете вернуть её обратно, проведя обратное перемещение. -
Прямой доступ к блочным устройствам: Если у вас есть права root, вы можете напрямую работать с блочными устройствами. В случае с файловой системой ext4 возможен экспорт файлов с использованием
debugfs
.
Применение
Эти методы могут варьироваться в зависимости от специфики задач и прав доступа. Например, если вы работаете в среде, где у вас есть только пользовательские права, то вариативность решений сильно ограничена. Однако, если у вас есть root доступ или возможность исполнять команды с повышенными правами через sudo
, способы доступа к «заслонённым» файлам становятся более разнообразными.
Использование инструментов, таких как unshare
, предлагает также один из решений. Это позволяет создать отдельное пространство имён для монтирования и дать команду доступа к "скрытым" файлам:
mkdir /tmp/above /tmp/below
touch /tmp/above/a /tmp/below/b
mount -o bind /tmp/above /tmp/below
ls /tmp/below # Видно 'a'
unshare --mount sh -c 'umount /tmp/below ; ls /tmp/below' # Видно 'b'
Заключение
В каждом из приведённых примеров требуется определённый уровень привилегий, хотя способы обхода ситуаций могут быть различными. Основной принцип заключается в понимании того, как файловые системы интегрированы и управляются в Linux. Наличие root-доступа значительно расширяет возможности, позволяя использование расширенных команд и утилит, таких как mount --bind
, unshare
, и манипулирование блочными устройствами.
Технологии управления файловыми системами в Linux обеспечивают большую гибкость, но требуют тщательного подхода и соблюдения мер предосторожности, особенно когда речь идёт о задачах с использованием административных привилегий. Таким образом, доступ к "заслонённым" файлам является осуществимой задачей, при условии правильного подхода и использования соответствующих инструментов.