web-dev-qa-db-ja.com

非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アカウントから実行されます。

でも、取り付けさえいらない方がいいかもしれないと思っていますが、よくわかりません。

7
svenema

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

mke2fs -dSudoなしの最小限の実行可能な例

mke2fsはe2fsprogsパッケージの一部です。これは、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への比較的新しい追加です d4deba22e2aa95ad958b44972dc933fd0ebbc59

したがって、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

これは、たとえば、ルートディレクトリがextXではなくNFSまたはtmpfsにある場合、これらのファイルシステムとして必要です 拡張プロパティがないようです

mke2fsmkfs.extXにシンボリックリンクされることが多く、man mke2fsは、そのようなシンボリックリンクでコールを使用すると、-tが暗黙的に含まれることを示しています。

これを見つけた方法と今後の問題を解決する方法: Buildroot Sudoなしでext2イメージを生成 ここに示すように なので、V=1でビルドを実行しただけで、最後に来る画像生成部からコマンドを抽出しました。古き良きコピー貼り付けで失敗したことは一度もありません。

TODO:次の問題を解決する方法を説明します。

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

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

Sudoは、まさにこのタイプの問題のために作成されたものであり、/ etc/sudoersファイルでマウントコマンドを実行するための権限をユーザーに与える必要があります。

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

Sudo mount -o loop $IMG $MNT

パスワードを必要としないようにルールを構成できます

2
dryliketoast