dd tools(archives tool) Raspberry Pi

RaspberryPiOSなどのSDカードを作成するにはdd toolsではOSイメージをダウンロード、展開する必要があります。
RasPiOSはzip形式なのでunzipするだけと比較的簡単なのですがほかのOS(ディストリビューション)では様々な形式があります。
圧縮展開コマンドのフロントエンドになるCLIツールもいくつかありそれらを利用しながらdd toolsとして実験、動作を検証してみたいと思います。(RasPiOSはシンプルなXarchiverがデフォルトのアーカイバになっているがどうもうまく使えない!)

基本仕様

作成したツールはcompression(圧縮)とdecomp(展開)が別になっています。展開ツールはファイラー(ranger)と連携してrangerで圧縮ファイルを選択するとそのディレクトリで起動します。
展開ツールは圧縮ファイルのみ表示(拡張子)、圧縮ツールは圧縮ファイル以外をリストに表示します。ディレクトリ込でアーカイブする際はそのディレクトリのある場所で実行しないとフルパスを指定することになってしまいます。双方ともカレントディレクトリを変更する際はリスタートするためdevilspie2で起動位置を固定しないと使いにくくなってしまいます。
いずれもリストにあるファイル(カレントディレクトリ)を選択、ボタンひとつで圧縮展開する簡単操作を目標にしています。特別なオプションが必要な時はコマンドラインで実行します。

rangerはatoolをアーカイバのフロントエンドに採用しています。ディフォルトはビュー(als)ですが展開(aunpack)にすることで展開実行できますが右側ウインドウをクリックで開始してしまうため代わりに作成した展開ツールを起動します。
~/.config/ranger/rifle.conf (最初の方に記載)

ext 7z|ace|ar|arc|bz2?|cab|cpio|cpt|deb|dgc|dmg|gz,  = ~/bin/dd-tool/archives_start.py "$@" &
ext iso|jar|msi|pkg|rar|shar|tar|tgz|xar|xpi|xz|zip, = ~/bin/dd-tool/archives_start.py "$@" &

多重起動を防ぐためスクリプト経由で起動
~/bin/dd-tool/archives_start.py (chmod755)

#!/usr/bin/python3
import subprocess
kill = ("ps ax | grep python3 | grep dd_archives.py | grep -v grep | awk '{print $1}'")
kill = (subprocess.Popen(kill, stdout=subprocess.PIPE, shell=True).communicate()[0]).decode('utf-8')
if not kill:
    pass
else:
    subprocess.run("kill -9 " + kill, shell=True)
subprocess.run("~/bin/dd-tool/dd_archives.py &", shell=True)

展開ツール(dd_archives.py)の圧縮ファイル拡張子はrangerと同じ拡張子をfindで検索

# Listbox 1 (archives)
def arc_list():
    global archives_list
    archives_list = ("find . -maxdepth 1 -name '*.7z' -or -name '*.ace' -or -name '*.ar' -or -name '*.arc' -or -name '*.bz2' -or -name '*.cab' -or -name '*.cpio' -or -name '*.cpt' -or -name '*.deb' -or -name '*.dgc' -or -name '*.dmg' -or -name '*.gz' -or -name '*.iso' -or -name '*.jar' -or -name '*.msi' -or -name '*.pkg' -or -name '*.rar' -or -name '*.shar' -or -name '*.tar' -or -name '*.tgz' -or -name '*.xar' -or -name '*.xpi' -or -name '*.xz' -or -name '*.zip' | awk '{print substr($0, 3)}'")

圧縮ツール(dd_comp.py)は上記の拡張子を除外

# Listbox 1 (file&dir)
def fd_list():
    global file_dir_list
    file_dir_list = ("ls -F -I '*.7z' -I '*.ace' -I '*.ar' -I '*.arc' -I '*.bz2' -I '*.cab' -I '*.cpio' -I '*.cpt' -I '*.deb' -I '*.dgc' -I '*.dmg' -I '*.gz' -I '*.iso' -I '*.jar' -I '*.msi' -I '*.pkg' -I '*.rar' -I '*.shar' -I '*.tar' -I '*.tgz' -I '*.xar' -I '*.xpi' -I '*.xz' -I '*zip' | sort")

dd_archives.py(展開ツール)


ディレクトリボタンでカレントディレクトリ移動可
展開系ツールはテストしてボタン1つか2つにする予定
テストは主に2021-05-07-raspios-buster-armhf-lite.zipを使って進めてみます
wgetで配布ファイルダウンロード

CLIフロントエンドツールは以下を試してみます(pigzは専用コマンド)
atool : Perlで書かれている 展開(aunpack) 圧縮(apack) 一覧(als) その他
unar : MAC The Unarchiver のコマンドライン版 展開(unar) 一覧(lsar)
unp : Perlで書かれている
pigz : gzip zip 展開(unpigz) RasPiOSデフォルトインストール済

インストール

 # apt install atool unar unp

OSデフォルト、依存でインストール以外のコマンド

 # apt install p7zip-full unrar-free

GNU time 時間を計測 外部コマンド /usr/bin/time

 # apt install time

テスト

ディレクトリボタンはfiledialog.askdirectoryでディレクトリのみ表示します
ディレクトリを選択、OKでリスタートしてカレントディレクトリを変更
ファイルを選択して適当なCLIツールボタンをクリック

lsar filename.xxx | head -20 で20行まで表示
RasPiOSの配布イメージは単一ファイルですがアーカイブされたファイルを展開する際はディレクトリ付きか確認、よくやってしまうのが同一ディレクトリに展開、既存ファイルとゴッチャになってアチャー!という結果になります。判断がつきかねる時はディレクトリを作成移動して実行

unarで実行 OK 各CLIツールも基本同じ コマンドラインからも簡単


実行中はrangerから展開中のファイルにアクセスしないようにします。
cpu load averageが異常に上がってきます。
終了するとメッセージとともに保存したlogを表示
lsarはunzipコマンドを実行していると思います。
実質展開時間 33.2s


unpigzで実行 OK
pigzについては後述


結果は/tmp/expansion.logに保存しています。(上書き)基本実行コマンドはエラーが無ければ静かに終了します。(各CLIツール仕様)logにはGNU timeの結果だけが記載
実質展開時間 17.8s

unpigz -9kN のオプションを指定、展開時も圧縮率設定(展開時間)が効いてくるようです。
元ファイルをキープ、-Nで拡張子をそのまま
-0 to -9, -11 Compression level (level 11, zopfli, is much slower)
-k, –keep Do not delete original file after processing
-N, –name Store or restore file name and mod time

wget
配布ファイルの取得はwgetでダウンロードするのが好みです。ブラウザから右クリック、リンクのアドレスをコピーして貼り付け。最近のX更新で右クリックコピーもXセレクションに入るので中ボタンで貼り付けることが出来ます。
ダウンロードが終了したらついでにchecksumを実行、sha256sumを実行、moode audioのみmd5を実行。軽く眺めて合っていればOK

所感
いまのところ動作確認程度ですが無難にこなしてくれそうなのがunar
gzip zipはunpigzがパフォーマンスを発揮しそう
atoolはRARに対応していないhttps://www.nongnu.org/atool/

dd_comp.py(圧縮ツール)

当サイトでは圧縮はそう頻繁に使うことは無いのですが捨てられないファイルのアーカイブやmoode audioの旧バージョンイメージを圧縮保存する用途を考慮しています。

この中で興味があるのが
pbzip2 pigz pixz
従来のコマンド系は面倒なのでapackに喰わせる
テストは展開した2021-05-07-raspios-buster-armhf-lite.imgを各形式で固めてみます

起動
一般ファイルはrangerと関連付け出来ないのでメニューから起動、または展開ツール(dd_archives.py)から起動します。
メニューからはユーザーのホームディレクトリ、展開ツールからは実行しているディレクトリがカレントディレクトリ。起動してからは展開ツール同様にディレクトリボタンで選択、設定したHome(ワークディレクトリ)
rangerを終了したりするとツールも終了するので圧縮展開実行中はできるだけ余計なことをしない

アーカイブファイル
ツールは基本ボタンだけで実行することを想定しているのでファイル(ディレクトリ)+形式
ファイル例 2021-05-07-raspios-buster-armhf-lite.img.gz
ディレクトリ例 sample_dir.tar.gz
zip 7z は特に指定なし
ファイル名の変更、移動、ディレクトリの作成等はファイラーなどで実行

Parallel Implementation
piXXはParallel Implementation(並列実装)
従来のコマンド系はシングルコアで実行するのに対してマルチコアに対応したコマンド系ですね。
pigz – Parallel Implementation of GZip
pbzip2 – parallel bzip2 implementation
pixz – parallel, indexing XZ compressor/decompressor
現在のRasPiOSではpigzはディフォルトでインストールされています。pigzには展開コマンド(unpigz)がありますが pbzip2 pixz には見つかりませんでした。

# apt install pbzip2 pixz


実行すると4つのコアがほぼ100%で動いています。p7zipもマルチコアに対応しているようです

Pi4ではかなりCPUパワーを消費するため特に圧縮については圧縮率と圧縮速度を天秤に掛ける必要があると思います。圧縮率を–best(-9)にしても実質10M〜20M改善するだけで圧縮にかかる時間だけがそれ以上にかかってきます。と言っても現在のunix系標準圧縮形式はgzと思っているので圧縮率をzipより悪くする訳にはいきません。zipと同等の圧縮率でzipコマンドより早い設定を探します。

$ pigz -6fk 2021-05-07-raspios-buster-armhf-lite.img

圧縮率 -6 、上書き -f 、キープ -k この設定を元にpythonプログラムに適用

シングルファイル
/usr/bin/time pigz -6fk file_name > /tmp/compression.log 2>&1
/usr/bin/time pbzip2 -6fk file_name > /tmp/compression.log 2>&1
/usr/bin/time pixz -6k file_name > /tmp/compression.log 2>&1
ディレクトリ
/usr/bin/time tar cvf dir_name.tar.gz --use-compress-prog='pigz -6fk' dir_name > /tmp/compression.log 2>&1
/usr/bin/time tar cvf dir_name.tar.bz2 --use-compress-prog='pbzip2 -6fk' dir_name > /tmp/compression.log 2>&1
/usr/bin/time tar cvf dir_name.tar.xz --use-compress-prog='pixz -6k' dir_name > /tmp/compression.log 2>&1

pixzはデフォルトで上書きするので”-f”オプションはありません。

テスト実行

zip 3m16s 445M


gz (apack) 3m14s 445M


pigz 1m06s 444M
やはりマルチコアでは早くなっています


pbzip2 3m07s 408M
pbzip2は中途半端な感じがしますが実際は圧縮するファイル形式で相当違いが出ると思います
圧縮率と速度でメリットが有るのでしょう


pixz 10m54s 308M
7zipとほぼ同等の圧縮率と思います


7zip 11m30s 302M

参考 あくまで参考です ファイル名にハイフン(“-“)があるといろいろ問題があるのでアンダースコア(“_”)に切り替えています。(取り敢えず現状は問題ありません)
06/20 10:30 間違いがあったので差し替えました(dd_archives.py dd_comp.py)
dd_archives.py
dd_comp.py
archives_start.py

圧縮した各形式を展開
デフォルトのzip元ファイルをunzipしたsha256sumと比較、各形式とも全て正常に圧縮展開しています

もう少しテストをしてボタンは再配置する予定です