Linuxシステム用のイメージファイルを準備しています。イメージを生成し、出力が毎回同じビット単位で表示されるようにするスクリプトを実行できる必要があります。
私は大きなバイナリファイルを作成し、パーティションを分割し、そのパーティションを使用してループデバイスを作成し、Iファイルシステムを作成する一般的なプロセスを経ます。その後、mount
ファイルシステムシステムLinuxそして初期化プログラム物を梱包し、パーティションをマウント解除し、ループデバイスを削除し、イメージファイルを持つようになりました。これをディスクにコピーすると、dd
Linuxシステムが正しく起動します。だからファイルシステムを正しく作成しています。
上記の手順を実行するスクリプトを実行しますが、出力は毎回異なります。そのうちのいくつかはタイムスタンプです。外部2データ構造私は読むプログラムを書いた。外部2構造はタイムスタンプtune2fs
などを消去しますが、ビットマップデータの一部は異なっていて、ファイルデータが毎回同じ場所にあるようには見えません。
それでは、同じファイルシステムをどのように作成できますか?
以下は、ファイルシステムの作成、ファイルの配置、およびアンマウントに使用するコマンドです。出力を保存して再実行して出力を比較すると、ファイルはa.txt
別の場所に配置されます。
dd if=/dev/zero bs=1024 count=46112 of=cf.bin
parted cf.bin <<EOF
unit
s
mklabel
msdos
mkpart
p
ext2
63s
45119s
set
1
boot
on
q
EOF
losetup -o $(expr 63 \* 512) /dev/loop0 cf.bin
mke2fs -b 1024 -t ext2 /dev/loop0 22528
#clear some parameters
tune2fs -i 0 /dev/loop0 # interval between check
tune2fs -L LABEL /dev/loop0
tune2fs -U 00000000-0000-0000-0000-000000000000 /dev/loop0 #uuid
tune2fs -c 0 /dev/loop0 #mount count
mount /dev/loop0 mnt
# make a dummy file
echo HELLO > mnt/a.txt
umount mnt
losetup -d /dev/loop0
更新
上記のコマンドをスクリプトに入れたら、コピーして貼り付けて2回目に実行し(その間に出力を保存します)、2回目のコマンドを実行する前に日付を変更してから(コマンドを使用date
)a.txt同じディスク位置に配置されます。ただし、スクリプトを実行している場合は、出力を保存してコマンドラインから再度実行して出力を比較します。a.txtさまざまな場所に位置しています。とても好奇心旺盛な行動です。ファイルの場所を生成するためにどのデータが使用されますか?どうやら今はそんな時ではない。私が考えることができる唯一のことは、スクリプトを2回呼び出してコマンドを2回呼び出すのと同じスクリプトでコマンドを2回実行することの違いは、呼び出しプロセスのプロセスIDと同じです。誰でもどんなアイデアがありますか?
更新#2
ext2の使用を放棄しました。したがって、ext2に関するあなたの元の質問に答えることはできませんが、基本的なLinuxシステムの完全に再現可能なビルドを得るために行ったことについて説明します。
- ext2の代わりにFATバリアントまたはISO9660を使用してください。 32MB未満のパーティションが必要な場合は、LinuxシステムパーティションにFAT16を使用し、それ以外の場合はFAT32を使用してください。 FAT16 または FAT32 は同じ場所にファイルを複製します。ただし、ディレクトリエントリにはいくつかのタイムスタンプがあります。
- 起動に必要なLinuxシステムファイルを追加します。
- FAT16/32ファイルシステムのディレクトリ構造を参照し、すべてのタイムスタンプを0に設定するプログラムを作成します。
- MBRからディスク署名を消去します。タイムスタンプを消去するプログラムでこれを実行するか、ddを使用してください。
- FATファイルシステムなので、ブートローダとしてsyslinuxを使用しています。 cpioは実行されるたびに同じinitrdを生成するので、問題はありません。これは基本的なビット単位の同じLinuxシステムに必要なすべてです。
FATファイルシステムの問題
Linuxシステムを起動しても、FATは問題を引き起こしません。しかし、より大きなデータ・パーティションの場合、FAT32 によっていくつかの問題が発生する可能性があります。
- ディレクトリ内の最大ファイル数に達することができます。これは問題ではありません。 (もちろん私の場合)
- FAT32 はファイルごとに 8.3 ファイル名を保存します。長いファイル名は、チルダと数字が追加された語幹に短縮されます。ただし、同じ短い行にマップされたファイルが9つ以上の場合、FAT32は文書化されていないプロセスを使用してファイル名に追加するハッシュ値の一種を生成します。時間をハッシュシードとして使用するFAT32用のLinuxカーネルコードを見ました(ファイル名i_vfat.cの関数
vfat_create_shortname()
)。したがって、このフィールドは再現できません。 Microsoftの実装がどのように機能するかわかりません。 8.3名前はDOS以外の用途には使用されないと思うので、このフィールドを消去するだけです。または、コピーできる一意の番号を生成できます。一意の番号なら何でも構いません。
ISO9660を追加パーティションとして使用
genisoimageを使用してisoを作成します。タイムスタンプを除いて、すべての実行で同じ出力を生成します。 -lオプションを使用すると、ファイル名に最大31文字を含めることができます。これより長いファイル名が必要な場合は、rock ridge拡張子を使用してください。コマンドは
genisoimage -o gfx.iso -R -l -f assets/files/
iso9660ファイルシステムに移動し、Rock RidgeエントリのTFフィールドを含むすべてのタイムスタンプを消去するプログラムを作成します。
- fdisk または parted を使用してディスクイメージにパーティションを作成します。 96hはISO9660のMBR ID番号です。
- 必要に応じてパーティションテーブルをパッチします。 Parted は iso9660 型パーティションの作成をサポートしていません。残念ながら、私は以前のバージョンのpartedとfdiskを使用してきましたが、partedははるかに使いやすいです。だから私はpartedを使って2番目のパーティションをfat32に設定しました。次に、fdiskを使用してタイプを96に変更します。
パーティションの作成に使用したのと同じ番号を使用して、ddを使用してisoをディスクイメージに含めます。使った
dd bs=512 seek=$part2_start_lba conv=notrunc if=gfx.iso of=cf.bin
ここで、cf.binは私のディスクイメージファイルです。 6. Linuxが起動したら、isoパーティションをマウントします。 isoが2番目のパーティションの場合は/ dev / sda2になります。まず、/ devに正しいデバイスファイルを作成するには、mknodを使用する必要があります。
ベストアンサー1
IMHO すべてが複雑すぎるようです。いつアスファルト一人で明確な解決策のように見えます。 tar は cdfs(--options cd9660:*) を含むほぼすべてのファイルシステムを作成できます。また、出力ファイルに-m || --modification-time
最新の、、、、--gid id || --gname name
...のいずれかでタイムスタンプを指定できます。--acls || --no-acls
--same-owner || --no-same-owner
あるいは、ファイルシステムを作成することもできます。chown -Rh someone:somegroup .
ファイルツリーでchmod
必要に応じて実行して使用tar
する同期ファイルツリーを準備されたファイルシステムに配置します。これにより、日付、所有者/グループ、権限などすべてが一貫して保持されます。
まあ、それが私がそのようなことに近づく方法です。 :)
ファタイ