如何以非 root 用户身份创建文件系统?

sve*_*ema 11 filesystems mount dd not-root-user

我想以非 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
Run Code Online (Sandbox Code Playgroud)

我有完全的 root 访问权限,所以我可以设置/准备任何东西,但脚本将从非 root 帐户执行。

但是,我觉得可能有更好的方法甚至不需要安装,但我不确定..

Cir*_*郝海东 9

mke2fs -d 没有的最小可运行示例 sudo

mke2fs是 e2fsprogs 包的一部分。它由著名的 Linux 内核文件系统开发人员 Theodore Ts'o 编写,他于 2018 年在 Google 工作,上游源位于 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"
Run Code Online (Sandbox Code Playgroud)

GitHub 上游.

关键选项是-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
Run Code Online (Sandbox Code Playgroud)

如果mke2fs失败:

__populate_fs: Operation not supported while setting xattrs for "qwer"
mke2fs: Operation not supported while populating file system
Run Code Online (Sandbox Code Playgroud)

添加选项时:

-E no_copy_xattrs
Run Code Online (Sandbox Code Playgroud)

例如,当根目录位于 NFS 或tmpfsextX 中时,这是必需的,因为这些文件系统似乎没有扩展属性

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-without-root-privileges/52850819#52850819

  • 为了创建 root 拥有的文件,您似乎可以使用 root_owner[=uid:gid] 扩展选项(-E),尽管我不知道如何获得更细粒度的控制(例如多个用户)。 (2认同)

fro*_*utz 5

必须是ext4吗?

如果可能有其他选择,您可以试试运气

  • mksquashfs,从用户空间生成只读压缩文件系统
  • mkisofs,产生一个只读文件系统,通常用于光学媒体
  • cpio, tar, ... 需要先解压的档案

否则,要使ext4用户空间成为现实,您必须

  • 发疯 debugfs
  • 在用户空间虚拟机中启动内核
  • 找到另一个知道处理 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
Run Code Online (Sandbox Code Playgroud)

根会话:(只是为了检查它是否有效)

# 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
Run Code Online (Sandbox Code Playgroud)

所以,这是可能的,而且有效。

然而,最实用的选择仍然是以某种方式使用 root。


小智 2

sudo正是针对此类问题,您需要授予用户在 /etc/sudoers 文件中运行 mount 命令的权限

然后在您的脚本中您可以在 mount 命令前面加上 sudo:

sudo mount -o loop $IMG $MNT

您可以配置规则,使其不需要密码