squashfs ファイル内のサブディレクトリに追加

squashfs ファイル内のサブディレクトリに追加

があると仮定すると、filesystem.squashfs以下を介して接続できます。

mksquashfs somefile filesystem.squashfs

somefileこれはsquashfsファイルのルートディレクトリに追加されます。ディレクトリを追加:

mksquashfs somedir/ filesystem.squashfs

その中のファイルとディレクトリはsomedir/squashfsファイルのルートディレクトリに追加されます。 squashfsツリーにディレクトリまたはファイルがある場合、mksquashfs古いファイルとディレクトリを変更せずに新しいファイルの名前が変更されます。その場合、「追加」というフレーズは意味があります。

私はunsquashfssquashfsを解凍する方法を知っていますが、解凍せずにsquashfsツリー内の既存のサブディレクトリに新しいファイルやディレクトリを追加する方法があるかどうか疑問に思います。

答え1

もちろん、ディレクトリやファイルをsquashfs_fileに追加することもできます。

mksquashfsの仕組みを理解する必要があります。概して、GrowthisofsがDVDに書き込むのと同様の方法でデータ圧縮ブロックを徐々に追加し、最終的に画像の表形式の内容であるTOCを更新します。もちろん、古いディレクトリを「削除」することはできません。なぜなら、増分書き込みは過去ではなく、将来にのみ関心があるからです! ! ! !

しかし、イメージ全体をdequashfsせずにsquashfsファイルを変更するための非常に簡単な方法があります(これはRAMやストレージデバイスの多くを占めることができます... dvd_iso 3-5GBイメージを考えてみてください!)。地図理念は次のとおりです。

1squashfs_file /mnt マウント (マウントは unsquashfs よりはるかに少ない記憶領域を使用します。)

2変更したいディレクトリを除いてsquashfs_fileを再構築し、必要な新しいディレクトリを追加します。

次の詳細:

  • cp /mnt/specific_dir $home ##modify $home/specific_dir as needed
  • mksquashfs /mnt new_squashfs_file -wildcards -e specific_dir
  • mksquashfs $home/specific_dir new_squashfs_file -keep-as-directory
  • umount /mnt # cleanup

もちろん、mksquashfsの他のすべてのオプションは通常どおり追加できます(ブロックサイズ、圧縮方法.... -b 1048576 -comp xz....)

説明のために、例はディレクトリの変更を示していますが、rootfsではetc usr ...を除いて、変更されたetc usrを2行目の追加メカニズムに追加できます。

ntfs raw パーティションを使用せずに 4 GB RAM "windows10 ノートブック" で完全な livecd Ubuntu を再管理する必要がある場合は、この方法を使用します。

助けてくれたら、Wang Ji。

答え2

Live-CDを再作成しようとしたときにフォルダをコピーして除外することはこれまでしかできません(私の場合は/ etc、/ lib、および/ usrをタッチする必要がありましたが、これはほとんどすべてのコンテンツを解凍するのと同じです)。

しかし、解凍せずに再圧縮するというアイデアにoverlayfsの利点を追加して、次のような結果を得ました。

SQFS=/path/to/my.sqfs
ADD=/path/to/additional/files/

mkdir /tmp/lower /tmp/upper /tmp/work /tmp/joined
mount $SQFS /tmp/lower
mount -t overlay none -olowerdir=/tmp/lower,upperdir=/tmp/upper,workdir=/tmp/work  /tmp/joined
rsync -a $ADD /tmp/joined
mksquashfs /tmp/joined ${SQFS}_new -comp xz -b 1M -noappend
umount /tmp/joined /tmp/lower
rm -rf /tmp/lower /tmp/upper /tmp/work /tmp/joined
mv ${SQFS}_new $SQFS

それでも新しいSQFSを作成する必要がありますが、古いSQFSのコンテンツを解凍する必要はなく、オーバーレイは古いディレクトリなどの新しいファイルを処理します。

PS私は最初にSQFSを解凍してから再圧縮するよりも速いことを望んでいましたが、そうではありません。結局のところ、新しいSQFSを作成するには、古いSQFS全体を読む必要があります。

関連情報