qemuブータブルディスクイメージとして使用されるvmイメージファイルを生成する必要があるプロジェクトを行っています。以前は、当社の製品は変更された Linux システムのようなもので、USB インストール ドライブに作成され、起動してベア メタル マシンにインストールされていました。しかし、今はハードウェアを取り除いて仮想マシンで実行したいので、イメージ ファイルが必要です。
既存の USB ドライブを使用して qemu にシステムをインストールし、vm をシャットダウンしてイメージを取得する代わりに、すぐに使えるイメージ ファイルを直接作成し、実マシンまたは仮想マシンでの起動とインストールをすべてスキップするように求められました。ただし、インストール済みのイメージを入手できるので、このイメージを配信するだけで、すぐに使用できる仮想マシン イメージとしてこのイメージをロードできます。
しかし、すべての手順で、ルート権限が必要なコマンドは使用できません! 理由は聞かないでください。私たちのプロジェクトにはたくさんの制限があります。ルート権限を使用できず、sudo も su も使用できず、通常のユーザーだけができることは何でも....
私がすでに達成した部分は、mke2fs -d コマンドの最新バージョンを使用して、このイメージ ファイルのさまざまなパーティションにフォルダーとファイルのツリーを作成することです。
イメージが起動された後、これらのフォルダー構造があるとします。
$ ls /
$ bin dev boot home lib32 mnt proc run srv tmp var boot data etc lib lib64 opt root sbin sys usr
一部のフォルダは異なるパーティションによってマウントされています
イメージから単一のパーティションを抽出する
dd if=image of=partitionN skip=offset_of_partition_N count=size_of_partition_N bs=512 conv=sparse
フォルダをパーティションに移入する
mke2fs -d root_dir/etc partitionN
パーティションをイメージに戻します
dd if=partitionN of=image seek=offset_of_partition_N count=size_of_partition_N bs=512 conv=sparse,notrunc
イメージの最初のパーティションはブート パーティションとしてあり、これには「boot」フォルダが含まれており、起動後に /boot の下にマウントされます。
このブート パーティションは EFI 互換パーティション (実際には FAT32 フォーマットのようです) です。
しかし、すべてのパーティションがイメージに正常に取り込まれた後、この起動可能なイメージに grub をインストールする方法が見つかりません。これは、このイメージを起動可能にするために必要な最も重要なステップです。
Web で見つけたすべての解決策は、イメージのブート パーティションをループ マウントすることを提案していますが、root 権限がないとイメージをループ マウントできないため、これは実行できません。
それで、これを行う方法を知っている人はいますか?
grub が生の値を mbr に書き込む方法、mbr 内の値からステージ 1 とステージ 2 を見つける方法、ステージ 2 の最初のセクターの最後にあるセクター リストを見つける方法を理解しようとしましたが、それは非常にクレイジーで、最終的に失敗しました。このトリックの仕事を取得します。