Как смонтировать файл образа без прав root?

41

Могу ли я смонтировать образ файловой системы без прав root? Обычно я бы сделал:

mount -o loop DISK_IMAGE FOLDER

Без использования sudo или установки suid mount, есть ли подходящий способ сделать это?

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

маргаритка
источник
1
Если ваш mountбинарный файл не требует разрешений SUID, вы можете использовать fakeroot без проблем.
Сакиск
5
@faif fakerootздесь не поможет: он притворяется, что владелец файла отличается, но он не может дать вам разрешения, которых у вас нет, например, для вызова, mount(2)когда вы не root.
Жиль "ТАК - перестань быть злым"
@faif Mount абсолютно требует прав суперпользователя. Потенциальные последствия в противном случае были бы довольно катастрофическими.
Шадур
связанные: unix.stackexchange.com/questions/96625/…
Сиро Сантилли 新疆 改造 中 at 法轮功 六四 事件

Ответы:

25

Вы не можете монтировать ничего, что администратор не дал вам разрешения на монтирование. mountСистемный вызов может вызвать только root . Причина этого заключается в том, что существует множество способов повысить привилегии путем монтирования, например монтировать что-либо в системном расположении, создавать файлы, принадлежащие другому пользователю, и использовать программу, которая зависит от владения файлами, создавать файлы setuid или использовать ошибки. в драйверах файловой системы.

Команда mountsetuid root. Но это только позволяет вам монтировать вещи, которые упомянуты в fstab.

Команда fusermountsetuid root. Он позволяет вам монтировать только через драйвер FUSE и ограничивает ваши возможности предоставлять таким образом файлы с произвольным владением или разрешениями (в большинстве случаев все файлы на монтировании FUSE принадлежат вам).

Лучше всего найти файловую систему FUSE , способную считывать образ вашего диска. Для образов ISO 9660 попробуйте как fuseiso, так и поддержку ISO 9660 от UMfuse (доступна в fuseiso9660комплекте с Debian ).

Жиль "ТАК - прекрати быть злым"
источник
+1 за объяснение, что sudo(хотя он имеет установленный бит SUID) позволяет только монтировать fstabзаписи. Из этого следует, что (а) бит SUID имеет смысл, так как обычный пользователь может монтировать fstabзаписи (и ему разрешено выполнять mountсистемный вызов) и (б) что mountутилита имеет ограничение, разрешающее fstabмонтировать записи только не коренные пользователи.
Дэвид
Если вы работаете с образами гибких дисков, вы также можете использовать mtools для простой записи данных в образ. Смотрите: stackoverflow.com/questions/11202706/…
Джайлс Батгейт
@ Давид, теперь это изменилось? Единственные записи, которые у меня fstabесть, предназначены для rootfs и boot. К креплению USB-накопителей я смотрю lsblkи mountсоответственно. У меня не было проблем с этим.
sherrellbc
16

Debian Wiki показывает несколько способов сделать это. Вот один из способов. (Для этого требуется udisks2пакет.)

Первый

$ udisksctl loop-setup -f $PATH_TO_IMAGE
Mapped file $PATH_TO_IMAGE as /dev/loop0.

/dev/loop0 будет использоваться для следующего.

Но если бы udisksctl loop-setupкоманда вернулась /dev/loop1, то /dev/loop1было бы использовано следующее.

Вам может потребоваться запустить, если петлевое устройство (ранее созданное) не смонтировано автоматически:

$ udisksctl mount -b /dev/loop0
Mounted /dev/loop0 at /media/$USER/$IMAGE_NAME

Вы можете посмотреть файлы на диске

$ ls -l /media/$USER/$IMAGE_NAME/

Вы можете размонтировать его, когда закончите

$ udisksctl unmount -b /dev/loop0
Unmounted /dev/loop0.

и при необходимости:

$ udisksctl loop-delete -b /dev/loop0
Ник Оделл
источник
1
Удевил был более удобный вариант
Анвар
Он работал на Ubuntu 16.04, но как? Кажется, используются петлевые устройства, которые я бы ожидал sudoтолько. Сецид или родственные махинации ?
Сиро Сантилли 事件 新疆 中 at 法轮功 六四 事件
1
@CiroSantilli 法轮功 改造 中心 六四 事件 法轮功 Я не уверен. Исходный код инструмента находится здесь . Кажется, он использует DBus для общения с демоном, но я не очень хорошо знаю DBus или Glib.
Ник ODell
1
Обратите внимание, что -rопция udisksctl loop-setupозначает «только для чтения», которую OP не запрашивал, так что опустите ее, чтобы получить доступное для записи монтирование.
Пелле Нильссон
15

Вы можете использовать гостевой модуль FUSE для монтирования нескольких типов образов дисков. Это часть экосистемы guestfs и не требует корневых разрешений.

Взгляните на справочную страницу для более подробной информации.

Примеры

1. Для типичного гостя Windows, основной файловой системой которого является первый раздел:

guestmount -a windows.img -m /dev/sda1 --ro /mnt

2. Для типичного гостя Linux с файловой системой / boot в первом разделе и корневой файловой системой на логическом томе:

guestmount -a linux.img -m /dev/VG/LV -m /dev/sda1:/boot --ro /mnt
Мэтью
источник
1
Досадно, что для запуска guestmount в Ubuntu теперь требуется некоторый root-доступ для чтения образов ядра: bugs.launchpad.net/ubuntu/+source/linux/+bug/759725
Clément
@ Clément Я хотел бы понять, почему libguestfs нужен образ ядра для своей работы ...
Сиро Сантилли 新疆 '中 at 法轮功 六四 事件
1
@CiroSantilli 法轮功 改造 中心 s root 法轮功, потому что libguestfs избегает необходимости в root, запуская минимальную систему Linux внутри виртуальной машины qemu (любой может запустить виртуальную машину qemu, не будучи пользователем root). Для загрузки этой машины требуется ядро ​​и initrd.
josch
3

Можно было бы добавить /etc/fstabзапись для ISO с параметром user, например

/test.iso /mnt/iso auto defaults,user 0 1

Но для редактирования этого файла обычно требуется root-доступ, так что это не очень полезно.

Ренан
источник
2

На самом деле очень легко монтировать более или менее все, что вы хотите, как обычный пользователь, без привилегий root, при условии, что в нем была создана правильная запись /etc/fstab.

Конечно, для модификации /etc/fstabтребуются права суперпользователя. Но одну запись можно использовать с большой гибкостью, чтобы (u) смонтировать множество разных файлов в разных точках монтирования, без какого-либо дальнейшего редактирования /etc/fstab.

Вот два очень коротких (5 строк + комментарии) Bash-скрипта, которые сделают эту работу:

для монтажа

#!/bin/sh
# usage: usmount device dir
# author: babou 2013/05/17 on https://unix.stackexchange.com/questions/32008/mount-an-loop-file-without-root-permission/76002#76002
# Allows normal user to mount device $1 on mount point $2
# Use /etc/fstab entry :
#       /tmp/UFS/drive /tmp/UFS/mountpoint  auto users,noauto 0 0
# and directory /tmp/UFS/
# Both have to be created (as superuser for the /etc/fstab entry)
rm -f /tmp/UFS/drive /tmp/UFS/mountpoint
ln -s `realpath -s $1` /tmp/UFS/drive
ln -s `realpath -s $2` /tmp/UFS/mountpoint
mount /tmp/UFS/drive || mount /tmp/UFS/mountpoint
# The last statement should be a bit more subtle
# Trying both is generally not useful.

и для демонтажа

#!/bin/sh
# usage: usumount device dir
# author: babou 2013/05/17 on https://unix.stackexchange.com/questions/32008/mount-an-loop-file-without-root-permission/76002#76002
# Allows normal user to umount device $1 from mount point $2
# Use /etc/fstab entry :
#       /tmp/UFS/drive /tmp/UFS/mountpoint  auto users,noauto 0 0
# and directory /tmp/UFS/
# Both have to be created (as superuser for the /etc/fstab entry)
rm -f /tmp/UFS/drive /tmp/UFS/mountpoint
ln -s `realpath -s $1` /tmp/UFS/drive
ln -s `realpath -s $2` /tmp/UFS/mountpoint
umount /tmp/UFS/drive || umount /tmp/UFS/mountpoint
# One of the two umounts may fail because it is ambiguous
# Actually both could fail, with careless mounting organization :-)

Каталог /tmp/UFS/создан, чтобы изолировать ссылки и избежать конфликтов. Но символические ссылки могут находиться в любом месте пользовательского пространства, если они остаются на том же месте (тот же путь). /etc/fstabЗапись никогда не меняется либо.

ЖИЗНЕННОЕ ПРЕДУПРЕЖДЕНИЕ: Монтаж ограничен по соображениям безопасности. Повышение его гибкости может открыть двери для вредоносного программного обеспечения. Я не эксперт по безопасности, и я бы порекомендовал вам открывать двери не более чем абсолютно необходимо ... используя опции, чтобы ограничить то, что можно сделать с файловыми системами, которые можно монтировать. Если знающий участник может прокомментировать вопросы безопасности, это может быть полезно.

Доступны различные варианты, чтобы ограничить использование монтируемых файловых систем, например, noexecкоторые препятствуют выполнению двоичных файлов или nosuidтем самым способствуют безопасности. На самом деле, эти параметры добавляются в качестве параметров по умолчанию, когда эти параметры userили usersиспользуются, что обязательно имеет место в том, что мы делаем ниже. Подумайте дважды, прежде чем изменить эти значения по умолчанию. http://en.wikipedia.org/wiki/Fstab

Другие варианты могут быть добавлены для дополнительной защиты. Например, опция owner в /etc/fstab записи позволит пользователям иметь дело только с файлами или устройствами, которыми они владеют. Смотрите man mount список вариантов: http://linux.die.net/man/8/mount .

Использование этой /etc/fstabзаписи также может быть ограничено через владение user.group каталогом (или каталогами), содержащим символические ссылки.

объяснение

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

Основная идея состоит в том, чтобы создать записи /etc/fstab, включающие эту опцию, userили usersтак, чтобы пользователь мог попросить mountвыполнить монтирование, указанное в этой записи, указав в качестве аргумента файл, который нужно смонтировать, или точку монтирования (но не обе в моем опыте) ,

Вам также нужен правильный вход umount(это немного другая проблема - см. Ниже). Этот параметр userобычно лучше, чем тот, который разрешает usersдоступ umountпользователю, смонтировавшему файловую систему, usersи разрешает его всем. К сожалению, опция userне всегда работает и может повлечь за собой некоторые другие шаги для работы. Это обсуждается в опции «пользователь» для монтирования, а не для монтирования .

Сначала вы добавляете к /etc/fstabзаписи, такой как:

/tmp/UFS/drive /tmp/UFS/mountpoint  auto users,noauto, 0 0

и использовать /tmp/UFS/driveв качестве символической ссылки (или символической ссылки) любое устройство или файл, который вы хотите смонтировать, например файл, содержащий образ файловой системы ISO /home/johndoe/john-image-file.iso.

Вы также определяете /tmp/UFS/mountpointкак символическую ссылку на точку монтирования, которую вы хотите использовать, скажем /mnt/iso.

Затем вы можете смонтировать john-image-file.isoс помощью команды:

$ mount /tmp/UFS/drive

Этого достаточно на моем Mageia Linux, так как использование петлевых устройств теперь стало неявным и больше не требует использования -o loopявно. Я не знаю, как это вообще сегодня. См. При монтаже, когда мне следует использовать петлевое устройство?

Этот монтаж появляется в таблицах и командах:

$ df | tail -1
/dev/loop0       5,1G  5,1G     0 100% /mnt/iso
$ tail -1 /etc/mtab
/dev/loop0 /mnt/iso udf ro,nosuid,nodev,noexec,relatime,utf8 0 0
$ mount | tail -1
/home/johndoe/john-image-file.iso on /mnt/iso type udf (ro,nosuid,nodev,noexec,relatime,utf8)
$ tail -1 /proc/mounts
/dev/loop0 /mnt/iso udf ro,nosuid,nodev,noexec,relatime,utf8 0 0
$ tail -1 /proc/self/mountinfo
46 22 7:0 / /mnt/iso rw,nosuid,nodev,noexec,relatime - udf /dev/loop0 ro,utf8
$ tail -1 /proc/self/mountstats 
device /dev/loop0 mounted on /mnt/iso with fstype udf

Операция монтирования может работать для любого файла или диска и требует только создания символической ссылки /tmp/UFS/driveна этот файл или на устройство для диска. Конечно, для символической ссылки может быть выбрано другое имя и местоположение, если оно никогда не меняется.

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

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

Чтобы отключить файл, вам нужно обратиться к устройству цикла, а не к файлу. Следовательно, вам нужна /etc/fstabзапись, которая соответствует как петлевому устройству, используемому /etc/mtabздесь /dev/loop0, так и точке монтирования здесь /mnt/iso.

Вы не можете создать такую ​​запись заранее, поскольку устройство петли может меняться, так как они распределяются динамически. Обратите внимание, что также возможно использовать устройство с фиксированной петлей, но это неудобно другими способами. См. Http://igurublog.wordpress.com/2011/01/22/how-to-allow-mounting-of-iso-files-by-a-regular-user/ ( этот блог действительно вдохновил ответ здесь ).

Тем не менее, вы можете найти название устройства петли, здесь /dev/loop0 , задав систему, как мы делали выше, несколькими различными способами. Затем /etc/fstabможно сделать нашу стандартную запись, чтобы она указывала на правильное петлевое устройство через символическую ссылку /tmp/UFS/driveи на точку монтирования, как было сделано ранее с помощью /tmp/UFS/mountpoint. После этого файл может быть размонтирован с помощью любой из следующих команд (при условии, что нет двусмысленности /etc/mtab, что является другой проблемой):

$ umount /tmp/UFS/drive
$ umount /dev/loop0
$ umount /mnt/iso
$ umount /tmp/UFS/mountpoint

Поскольку две символические ссылки нужны только при выдаче команд, они могут быть изменены динамически. Таким образом, наша единственная /etc/fstabзапись позволяет монтировать любое количество файлов и монтировать их в любом порядке, без прав root.

Другие ссылки:

бабу
источник
Когда записи fstab указывают на символические ссылки, нельзя ли их использовать для монтирования чего-либо без root, просто создавая символические ссылки? Косвенно, разве это не просто mountкоманда повышения прав для каждого обычного пользователя? И поэтому проблемы безопасности, связанные с этим? Поправьте меня если я ошибаюсь.
Бхарат Г.
А последние версии дистрибутивов GNU / Linux (скажем, debian jessie) не будут предоставлять логин при входе в систему при обнаружении недопустимой записи в fstab. Он возвращается к сеансу входа в консоль, если раздел deviceили mountpointраздел fstab не указывает на допустимую запись. Пользователь должен войти через консольный сеанс и войти, startxчтобы явно запустить диспетчер отображения.
Бхарат Г.
0

Пакет libguestfs-tools-c имеет команду guestmount, поэтому

mkdir dvd    
guestmount -a image.iso -r -i dvd 

df покажет image.iso

df

для того, чтобы вынести мы имеем:

guestunmount dvd
Сержио
источник