ラズベリーパイ イメージファイルの圧縮

Windowsのパソコンを使ってRaspberry Pi用のプログラムを作成しているが、途中でSDカードが読めなくなってもフリダシに戻らないで済むよう、少し進むたびにwin32DiskImagerでイメージファイルのバックアップを取っている。

最終的に出来上がったものはGoogleドライブなどにアップロードしているのだが、イメージファイルそのもののファイルサイズはSDカードのサイズと同じ(SDカードが8GBならイメージファイルも8GB)でかなり大きい。

そこで、ZIPやRARで圧縮してからアップロードするのだが、圧縮率が低くてファイルがあまり小さくならないことがあり、圧縮方法について検討し、小さくできる方法に気づいたので記しておく。

ファイルの圧縮率が低かったのは、ホームラジオやラジオサーバーといったラジオ関連製品で、プログラム作成に伴うテスト中に複数のラジオ番組を録音していた。 完成時には録音ファイルは削除したのだが、この状態では圧縮率が低くファイルはかなり大きいままだった。

通常の方法でファイルを削除する場合、Linuxではrm、Winodwsではゴミ箱に入れてからゴミ箱を空にする操作を行うが、この場合はファイルのいわゆる”もくじ”部分を削除しただけで、SDカードやHDD上にはまだそのファイルの中身自体は残っている。 この状態でイメージファイルを作成すると、そのファイルの中身自体はイメージファイル内にあり、このランダムなデータの列が圧縮率を下げる原因だった。 つまり、00 00 00 00 や ff ff ff ffのように同じデータが延々続くイメージファイルであれば、圧縮するときに”ゼロゼロが4個”、”ffが4個”というように簡単に置き換えられるが、ランダムなデータではこれが出来ないので圧縮率が上がらないのだ。

そこで、イメージファイルを作成する前に以下の処理を行った。

df で現在の空き容量を調べる

df

この画像では、一番上の /dev/root の部分のAvailable列の 3303940(KB)が空き部分の容量である。

続いて

と入力し、実行する。 /dev/root 内に、tempfileという名前のファイルを、3303940(KB)分作成するのだが、かなり時間がかかるのでしばらく待つ。 終了するとこれまで空き容量だった部分に目一杯 tempfile というファイル名のファイルが作成されている。

最後に shred コマンドでファイルを完全に消去する。

各オプションの意味は、-v 処理過程を表示、 -n 0 ゼロ回上書き処理を行う(一回だけデータを書き込む)、-z 最後に全部のデータをゼロに書き換える(つまり00 00 00 00…)、-u 処理が起こったらファイルを削除する、という意味である。 shredはハードディスクに書き込まれているデータを完全消去するためのもので、磁気記録の場合は一度データを上書きしても、以前に記録されていたデータが薄く残っているので、なんどもランダムなデータを書き込んで見えなくするために -n で上書き回数が指定できるのだが、今回はデータを全部ゼロに書き換えるのが目的なので -n 0 で行っている。

この処理を行ってからファイルを圧縮してみたところ、処理前に比べて1GBあまり小さいファイルにすることが出来た。(8GBのイメージファイルでRAR5で圧縮後に1.2GB程度)

 


starstonesoft

投稿者: starstonesoft

1995年からフィリピン在住。 海外生活に役立つことなどを紹介していきたいです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です