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

Вот что я сейчас делаю:

#!/bin/sh

IMG="app.ext4"
LBL="PIHU_APP"
MNT="/mnt/PIHU_APP"
APP="/home/buildroot/board/arctura/PIHU_APP/application"

#64MB:
dd if=/dev/zero of=$IMG bs=4096 count=16384

mkfs.ext4 $IMG
e2label $IMG $LBL

mkdir -p $MNT
mount -o loop $IMG $MNT
cp -r $APP $MNT
sync
umount $MNT

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

Тем не менее, у меня есть ощущение, что может быть лучший способ, который может даже не нуждаться в монтаже, но я не уверен.

11
Ciro Santilli 新疆再教育营六四事件法轮功郝海东 17 Окт 2018 в 13:24
Вам может потребоваться разрешить этому пользователю монтироваться методом sudoers ... или если ваш дистрибутив в качестве группы монтирования назначает этого пользователя в этой группе, чтобы разрешить ему монтирование без sudo // другой подход - создать файл iso из вашего исходного каталога и скопируйте его с помощью dd или другого метода в образ диска, который вы создаете... в зависимости от его конечного использования
 – 
francois P
14 Фев 2018 в 00:15
Предохранитель может вас заинтересовать
 – 
Gerard H. Pille
14 Фев 2018 в 00:16
Я уверен, что использовал Losetup как непривилегированный пользователь, и после его подключения я просто сделал разделы с помощью cfdisk, как обычно. Не могу вспомнить, в каких группах я был участником, но не был в staff. Попробуйте проиграть
 – 
user2497
14 Фев 2018 в 00:28
@GerardH.Pille .. Описание на справочной странице начиналось с надежды. Страница руководства не смогла объяснить мне, как ее использовать.
 – 
svenema
14 Фев 2018 в 21:40

4 ответа

mke2fs -d минимальный исполняемый пример без sudo

mke2fs является частью пакета e2fsprogs. Он написан известным разработчиком файловой системы ядра Linux Теодором Цо, который работает в Google с 2018 года, а исходный код находится на kernel.org по адресу: https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs Таким образом, этот репозиторий можно считать эталонной пользовательской реализацией ext операции с файловой системой:

#!/usr/bin/env bash
set -eu

root_dir=root
img_file=img.ext2

# Create a test directory to convert to ext2.
mkdir -p "$root_dir"
echo asdf > "${root_dir}/qwer"

# Create a 32M ext2 without sudo.
# If 32M is not enough for the contents of the directory,
# it will fail.
rm -f "$img_file"
mke2fs \
  -L '' \
  -N 0 \
  -O ^64bit \
  -d "$root_dir" \
  -m 5 \
  -r 1 \
  -t ext2 \
  "$img_file" \
  32M \
;

# Test the ext2 by mounting it with sudo.
# sudo is only used for testing.
mountpoint=mnt
mkdir -p "$mountpoint"
sudo mount "$img_file" "$mountpoint"
sudo ls -l "$mountpoint"
sudo cmp "${mountpoint}/qwer" "${root_dir}/qwer"
sudo umount "$mountpoint"

GitHub upstream.

Ключевым параметром является -d, который выбирает, какой каталог использовать для изображения, и это относительно новое дополнение к v1.43 в фиксации 0d4deba22e2aa95ad958b44972dc933fd0ebbc59

Поэтому он работает на Ubuntu 18.04 из коробки, в которой есть e2fsprogs 1.44.1-1, но не на Ubuntu 16.04, которая имеет версию 1.42.13.

Однако мы можем сделать так же, как Buildroot, и легко скомпилировать его из исходного кода в Ubuntu 16.04 с помощью:

git clone git://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git
cd e2fsprogs
git checkout v1.44.4
./configure
make -j`nproc`
./misc/mke2fs -h

Если mke2fs не работает с:

__populate_fs: Operation not supported while setting xattrs for "qwer"
mke2fs: Operation not supported while populating file system

При добавлении опции:

-E no_copy_xattrs

Это требуется, например, когда корневой каталог находится в NFS или tmpfs вместо extX, поскольку эти файловые системы похоже, не имеет расширенных свойств.

mke2fs часто является символической ссылкой на mkfs.extX, а man mke2fs говорит, что если вы используете call if с такой символической ссылкой, то подразумевается -t.

Как я это обнаружил и как решить будущие проблемы: Buildroot генерирует образы ext2 без sudo как показано здесь , поэтому я просто запустил сборку с помощью V=1 и извлек команды из части создания образа, которая идет в самом конце. Старый добрый копипаст меня никогда не подводил.

TODO: опишите, как решить следующие проблемы:

Несколько разделов в одном файле образа

См. это: https:/ /stackoverflow.com/questions/10949169/how-to-create-a-multi-partition-sd-image-без-root-привилегий/52850819#52850819

9
Ciro Santilli 新疆再教育营六四事件法轮功郝海东 17 Окт 2018 в 11:51
1
Кажется, что для создания файлов, принадлежащих root, вы можете использовать расширенную опцию root_owner[=uid:gid] (-E), хотя я не видел, как получить более детальный контроль (например, несколько пользователей).
 – 
Keeely
11 Мар 2019 в 03:26

Должен ли он быть ext4?

Если возможны альтернативы, вы можете попытать счастья с

  • mksquashfs создает из пользовательского пространства сжатую файловую систему, доступную только для чтения.
  • mkisofs создает файловую систему только для чтения, обычно используемую для оптических носителей.
  • cpio, tar, ... архивы, которые необходимо распаковать в первую очередь

В противном случае, чтобы сделать ext4 в пользовательском пространстве реальностью, вам нужно

  • сойти с ума с debugfs
  • загрузите ядро ​​​​в пользовательском пространстве vm
  • найти другую чистую утилиту пользовательского пространства, которая знает, как обрабатывать изображения ext4

Что касается debugfs, в большинстве файловых систем даже нет таких утилит, вам повезло.

Сеанс пользователя:

$ truncate -s 64M app.ext4
$ /sbin/mkfs.ext4 app.ext4
Creating filesystem with 65536 1k blocks and 16384 inodes
$ /sbin/debugfs -w app.ext4
debugfs:  mkdir this_is_crazy
debugfs:  cd this_is_crazy
debugfs:  write /proc/config.gz config.gz
Allocated inode: 13

Корневая сессия: (просто проверить, работает ли она)

# mount -o loop app.ext4 loop/
# cd loop/
# ls
lost+found  this_is_crazy
# md5sum this_is_crazy/config.gz /proc/config.gz 
7b414ad844272a9e3c31931037fe0495  this_is_crazy/config.gz
7b414ad844272a9e3c31931037fe0495  /proc/config.gz

Так что это возможно и это работает.

Тем не менее, наиболее практичным вариантом все равно должно быть использование root каким-либо образом.

5
frostschutz 14 Фев 2018 в 03:34
Не обязательно ext4, ext2 или ext3 тоже подойдут. Но, как вы сказали, это не очень практично ;-)
 – 
svenema
17 Фев 2018 в 14:00
Форма mke2fs e2fsprogs, к которой также принадлежит debugfs, теперь имеет параметр -d, который делает именно то, что просил OP, в том числе для ext4: unix.stackexchange.com/a/475484/32558
 – 
Ciro Santilli 新疆再教育营六四事件法轮功郝海东
15 Окт 2018 в 21:51

sudo создан именно для такого типа проблем, вам нужно дать пользователю разрешение на запуск команды mount в файле /etc/sudoers

Затем в вашем скрипте вы можете добавить команду mount с помощью sudo:

sudo mount -o loop $IMG $MNT

Вы можете настроить правило так, чтобы оно не требовало пароля

1
dryliketoast 14 Фев 2018 в 01:22
Обратите внимание, что предоставление любому пользователю права запускать mount под sudo в значительной степени позволяет этому пользователю владеть всей машиной.
 – 
Andrew Henle
14 Фев 2018 в 03:50
Да, так что это был бы мой последний вариант
 – 
svenema
14 Фев 2018 в 21:19
sudo позволяет вам ограничить, какие команды (и аргументы) может выполнять пользователь. Дополнительная информация здесь superuser.com/questions/735172/…
 – 
dryliketoast
15 Фев 2018 в 17:19

Вы можете добавить его в fstab с опцией user, чтобы пользователь мог его монтировать.

/path/to/app.ext4 /mount/point ext4 loop,user,noauto 0 0

Затем ваш пользователь может создать файл и просто запустить:

mount /mount/point
1
V13 15 Окт 2018 в 04:56