スクリプト/メイク/自動化に適したコードを使用して、ディスクイメージ(UEFI / Syslinux USB Linux起動[OSインストーラ]用の2つのパーティション、1つのFATファイルシステム、および1つのext4ファイルシステム)を構築する必要があります。本番では決して変わりません)。任意サイズのファイルセットサイズに非常に近い。つまり、ビルドファイルセットが与えられたら、FATおよびext4ファイルシステムイメージを作成する方法とそれを保持するためにパーティション化されたディスクイメージを作成する方法を知る必要があり、サイズはできるだけゼロに近い空き容量になるように計算されます。スペースをもう少し確保してミスをしても大丈夫ですが、2年後誰かがファイルにN+1バイトを追加すれば失敗しても大丈夫です。これはmakefileに合うべきです。つまり、試行錯誤は問題を解決しません(状況がさらに悪化すると、しきい値のある反復ソリューションが機能できると仮定します)。これはISO-9660イメージ(以前のプロジェクトで使用されていましたが、SyslinuxはUEFIでISO-9660イメージをサポートしていません)と似ています。
私はdd
(ディスクイメージの割り当て)、parted
(dd
FATファイルシステムの割り当て)、mkfs.vfat
(dd
ext4の場合)、mkfs.ext4
(kpartx
マッピングされたパーティション)、dd
(FATパーティションへの書き込み)、dd
(ext4パーティションへの書き込み)を使用しています。最後にdd
起動するUSBにディスク画像を書き込みます。実際のハードウェア。
現在の私の考えは、du
ファイルがビルドディスクに占めるスペースを決定し、追加のファイルシステムとパーティションのオーバーヘッドとエラー制限の余裕を追加することです。したがって、dd
与えられた各出力のブロック数を知る必要がありますdu
。
別のオプションは、大きな固定サイズのイメージを作成し、ファイルを作成し、FAT、ext4、およびパーティションのサイズを最小サイズに調整することです。 ext4ファイルシステムは縮小でき、FATファイルシステムも縮小できることを確認しました。しかし、まだスケールをどれだけ減らすべきかを計算する問題に直面しています。以前にこれを行ったことがあり、具体的なアイデア(またはサンプルコード)を持っている人がいるかどうか疑問に思います。
答え1
私はファジー要素と反復アプローチ(安全装置として)の組み合わせを使用しました。もともと思ったほど複雑ではありません。現在、FATにはパージはほとんど必要ありませんが、ext4にはファジー係数が0なので、空き容量が十分です(21M以上)。私はext2に変換し(誰が臭いログが必要ですか?!)、ブロックサイズを増やし、必要なinodeの数を慎重に計算して、より多くの空き容量を得ました。私はduから「実際のサイズ」を取得してそこから計算できると仮定しますが、ファイルシステムが異なる場合でも、計算オーバーヘッドがより近い近似になると思います。
# Estimated filesystem overhead, in 512-byte blocks
FS_ESP_FUDGE=256
FS_ISO_FUDGE=-80000 # Wow!
FS_FUDGE_INCR=1024
...
read ESP_RSIZE d < <(du --summarize --block-size=512 $ESP)
read ISO_RSIZE d < <(du --summarize --block-size=512 $ISO)
success=false
until $success; do
let ESP_SIZE=ESP_RSIZE+FS_ESP_FUDGE
let ISO_SIZE=ISO_RSIZE+FS_ISO_FUDGE
let ESP_START=2048
let IMG_SIZE=ESP_SIZE+ISO_SIZE+ESP_START
let ESP_END=ESP_START+ESP_SIZE-1
let ISO_START=ESP_END+1
success=true
...
sudo /sbin/mkfs.vfat /dev/mapper/$p1 -F 16 \
|| error_exit "mkfs.vfat failed" 5
# -N: Count the inodes (all files, plus . and .. for each directory,
# which I can't get "find" to include).
sudo /sbin/mke2fs -b 4096 -N $(( $(find $ISO | wc -l ) + 2 * $(find $ISO -type d | wc -l))) -m 0 -q /dev/mapper/$p2 \
|| error_exit "mke2fs failed" 6
...
if ! tar -C $ESP -c --exclude-vcs --exclude-backups . | \
sudo tar -C mnt/esp -x; then
{
read
read fs onek used avail use rest
} < <(df mnt/esp)
# Are we out of disk space? If not, bail, else increase margin, retry
[[ $onek -ne $used || $avail -ne 0 || $use != "100%" ]] && \
error_exit "esp tar failed" 9
let FS_ESP_FUDGE=FS_ESP_FUDGE+FS_FUDGE_INCR
success=false
fi
if ! tar -C $ISO -c --exclude-vcs --exclude-backups . | \
sudo tar -C mnt/iso --owner=root --group=root -x ; then
{
read
read fs onek used avail use rest
} < <(df mnt/iso)
# Are we out of disk space? If not, bail, else increase margin, retry
[[ $onek -ne $used || $avail -ne 0 || $use != "100%" ]] && \
error_exit "iso tar failed" 10
let FS_ISO_FUDGE=FS_ISO_FUDGE+FS_FUDGE_INCR
success=false
fi
$success || echo "Whoops, I guessed too small; please adjust fudge factor. Retrying ..."
...
done