root以外のユーザーによるファイルシステムの作成

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ではなくアカウントで実行されます。

しかし、インストールを必要としないより良い方法があるかもしれないと感じていますが、わかりません。

答え1

mke2fs -d最小限の実行可能な例、不要sudo

mke2fse2fsprogs パッケージの一部です。 2018年、Googleで働いた有名なLinuxカーネルファイルシステム開発者Theodore Ts'oが作成しました。アップストリームのソースコードは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アップストリーム

重要なオプションは、イメージ-dに使用するディレクトリを選択することです。これは、コミットv1.43への比較的新しい追加です。0d4deba22e2aa95ad958b44972dc933fd0ebbc59

したがって、e2fsprogs 1.44.1-1を使用するUbuntu 18.04ではデフォルトで機能しますが、バージョン1.42.13を搭載したUbuntu 16.04では機能しません。

ただし、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にある場合、またはこれらのファイルシステムとしてextXの代わりにある場合にtmpfs必要です。拡張属性がないようです。

mke2fs通常はにシンボリックリンクされておりmkfs.extXman mke2fsこれらのシンボリックリンクでcall ifを使用する場合、意味は-t暗黙的に使用されます。

これを発見した方法と今後の問題を解決する方法は次のとおりです。ルート構築sudo なし ext2 イメージビルド図からわかるようにだから、私はビルドを実行しV=1、最終的なイメージビルドセクションからコマンドを抽出しました。古いコピー - 貼り付けは決して私を失望させませんでした。

TODO:次の問題を解決する方法を説明してください。

1つのイメージファイルに複数のパーティションがある

確認してください:https://stackoverflow.com/questions/10949169/how-to-create-a-multi-partition-sd-image-without-root-privileges/52850819#52850819

答え2

必ず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

ルートセッション:(動作していることを確認するため)

# 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

したがって、可能で動作します。

しかし、最も実用的なオプションは、何らかの方法でルートを使用することです。

答え3

sudoこれらの問題については、/ etc / sudoersファイルでmountコマンドを実行するためのユーザー権限を付与する必要があります。

その後、スクリプトでmountコマンドの前にsudoを追加できます。

sudo mount -o loop $IMG $MNT

パスワードが必要ないようにルールを設定できます。

答え4

virt-make-fsコマンドはすべての要件を満たすことができます

sudo yum install -y /usr/bin/virt-make-fs
virt-make-fs -s 64M -t ext4 $APP $IMG --label=$LBL

また見なさい:https://libguestfs.org/virt-make-fs.1.html

関連情報