いくつかのext2画像を生成する必要があります。そのための明白な方法は、イメージを作成し、マウントして、コンテンツをコピーすることです。ただし、root権限が2回必要です(ファイルをchownしてイメージをマウントするため)。また、画像を生成するための2つのツールe2fsimageとgenext2fsを見つけました。
genext2fsは、生成中に画像をRAMに配置しますが、私の画像の1つのサイズは約30GiBです。
e2fsimageは、画像サイズの一部の値でクラッシュします。
では、どうすれば画像を生成できますか?ツールが画像サイズ自体を計算するのは素晴らしいことです。
e2fsimage
がクラッシュする理由を理解しました。画像サイズが4GiBより大きい場合、int32オーバーフローが原因で発生します。したがって、解決策は、必要なブロックとiノードをカウントし、ループファイル(truncate
&mke2fs
)を作成してから、e2fsimage
を-n
引数とともに使用することです(したがって、ループファイルですが、作成済みのものを使用してください)
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に比較的新しく追加されたものです d4deba22e2aa95ad958b44972dc933fd0ebbc59
したがって、e2fsprogs1.44.1-1を備えたUbuntu18.04で動作しますが、1.42.13であるUbuntu16.04では動作しません。
ただし、Buildrootと同じように実行し、Ubuntu16.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.extX
にシンボリックリンクされており、man mke2fs
は、そのようなシンボリックリンクでcallを使用すると、-t
が暗示されることを示しています。
これをどのように見つけ、将来の問題を解決する方法: Buildroot Sudoなしでext2イメージを生成します ここに示すように なので、V=1
を使用してビルドを実行しました。最後に来る画像生成部分からコマンドを抽出しました。古き良きコピーペーストは私を失敗させたことはありません。
TODO:次の問題を解決する方法を説明してください。
du
、ディレクトリ構造にfind . | wc
を使用した最初の見積もりは、32Mb(小さい方の失敗)の場合は最小で、コマンドが機能するまで2倍にすることは、非常に適切なアプローチである可能性があります。 Buildrootはこれを行っていましたが、何らかの理由で停止しましたが、自分で実装するのは簡単です。1つのイメージファイル内の複数のパーティション
イメージの作成にはroot権限は必要ありません。 ext2イメージを作成する例を次に示します。
dd if=/dev/zero of=./MyDisk.ext2 bs=512 count=20480
mkfs.ext2 ./MyDisk.ext2
ただし、デバイスをマウントするにはroot権限が必要です。
mkdir MyDisk
Sudo mount ./MyDisk.ext2 MyDisk