複数の ext2 イメージを生成する必要があります。これを行うための明白な方法は、イメージを作成し、マウントして内容をコピーすることです。ただし、ルート権限が 2 回必要になります (ファイルの chown とイメージのマウント)。また、イメージを生成するための 2 つのツールを見つけました: e2fsimage と genext2fs。
genext2fs は生成中にイメージを RAM に配置しますが、イメージの 1 つのサイズは約 30 GiB です。
e2fsimage は、イメージ サイズの値によってはクラッシュします。
では、画像を生成するにはどうすればいいのでしょうか? ツール自体が画像サイズを計算してくれると便利です。
答え1
mke2fs -d
最小限の実行可能な例sudo
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"
重要なオプションは-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.extX
、man mke2fs
そのようなシンボリックリンクで call if を使用すると が-t
暗黙的に指定されることを示します。
私がこれを発見した方法と、将来の問題を解決する方法:ビルドルートsudoなしでext2イメージを生成するここに示すようになので、ビルドを実行してV=1
、最後にあるイメージ生成部分からコマンドを抽出しました。古き良きコピー&ペーストは、私にとって決して役に立たない方法ではありません。
TODO: 次の問題を解決する方法を説明してください。
- イメージ内に sudo 所有のファイルを作成します。Buildroot がそれを実行します。
- 必要最小限のサイズを自動的に計算します。
du
ファイル サイズとfind . | wc
ディレクトリ構造の初期見積もりでは、32 MB (より小さいサイズ) を最小値として、コマンドが機能するまで 2 倍に増やしていくのが、おそらく非常に適切なアプローチです。Buildroot は以前はこれを実行していましたが、何らかの理由で停止しました。しかし、自分たちで実装するのは簡単です。 - パーティションからすべてのファイルを簡単に抽出します。
1つのイメージファイルに複数のパーティション
答え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