空き領域がほとんどないファイルセットに正確に収まるように、ディスクイメージ/ファイルシステムのサイズを変更します。

空き領域がほとんどないファイルセットに正確に収まるように、ディスクイメージ/ファイルシステムのサイズを変更します。

スクリプト/メイク/自動化に適したコードを使用して、ディスクイメージ(UEFI / Syslinux USB Linux起動[OSインストーラ]用の2つのパーティション、1つのFATファイルシステム、および1つのext4ファイルシステム)を構築する必要があります。本番では決して変わりません)。任意サイズのファイルセットサイズに非常に近い。つまり、ビルドファイルセットが与えられたら、FATおよびext4ファイルシステムイメージを作成する方法とそれを保持するためにパーティション化されたディスクイメージを作成する方法を知る必要があり、サイズはできるだけゼロに近い空き容量になるように計算されます。スペースをもう少し確保してミスをしても大丈夫ですが、2年後誰かがファイルにN+1バイトを追加すれば失敗しても大丈夫です。これはmakefileに合うべきです。つまり、試行錯誤は問題を解決しません(状況がさらに悪化すると、しきい値のある反復ソリューションが機能できると仮定します)。これはISO-9660イメージ(以前のプロジェクトで使用されていましたが、SyslinuxはUEFIでISO-9660イメージをサポートしていません)と似ています。

私はdd(ディスクイメージの割り当て)、partedddFATファイルシステムの割り当て)、mkfs.vfatddext4の場合)、mkfs.ext4kpartxマッピングされたパーティション)、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

おすすめ記事