スーパーユーザー権限なしで ext2 イメージを作成するにはどうすればいいですか?

スーパーユーザー権限なしで ext2 イメージを作成するにはどうすればいいですか?

複数の ext2 イメージを生成する必要があります。これを行うための明白な方法は、イメージを作成し、マウントして内容をコピーすることです。ただし、ルート権限が 2 回必要になります (ファイルの chown とイメージのマウント)。また、イメージを生成するための 2 つのツールを見つけました: e2fsimage と genext2fs。

  • genext2fs は生成中にイメージを RAM に配置しますが、イメージの 1 つのサイズは約 30 GiB です。

  • e2fsimage は、イメージ サイズの値によってはクラッシュします。

では、画像を生成するにはどうすればいいのでしょうか? ツール自体が画像サイズを計算してくれると便利です。

答え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にある場合や、tmpfsファイルシステムがextXではなく拡張プロパティがないようです

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

クラッシュの原因が分かりましたe2fsimage。これは、イメージ サイズが 4GiB を超えると int32 オーバーフローが発生するためです。したがって、解決策としては、必要なブロックと inode をカウントし、ループ ファイル ( truncate& mke2fs) を作成してから、引数e2fsimageとともに使用します-n(ループ ファイルは作成されず、既に作成されているものが使用されます)。

答え3

イメージの作成には root 権限は必要ありません。以下は ext2 イメージを作成する例です。

dd if=/dev/zero of=./MyDisk.ext2 bs=512 count=20480
mkfs.ext2 ./MyDisk.ext2

ただし、デバイスをマウントするにはルート権限が必要です。

mkdir MyDisk
sudo mount ./MyDisk.ext2 MyDisk

関連情報