deb2sfs.sh - deb(Debianパッケージ)をsfs(SquashFS)に変換するシェルスクリプト

以上のフォーラム以外の開発者の話題

モデレータ: YoN, nyu

ssnys
記事: 64
登録日時: 14/02/19(水) 17:50

deb2sfs.sh - deb(Debianパッケージ)をsfs(SquashFS)に変換するシェルスクリプト

投稿記事 by ssnys »

手前味噌で大変恐縮ではございますが、deb(Debianパッケージ)をsfs(SquashFS)に変換するシェルスクリプトを作成致しました。 :o

以下のコードを貼り付けて保存し、実行権限を与えてください。ファイル名はdeb2sfs.shがお勧めですが、それ以外でも構いません。

コード: 全て選択

#!/usr/bin/env sh

## DebianパッケージをSquashFSに変換する
#
# @author ssnys
# @version 0.1.0
# @date 2018-06-22
# @licence https://creativecommons.org/licenses/by/4.0/
# @see http://sakurapup.com/forum1/viewtopic.php?f=31&t=3372

deb2sfs () (
	# shの設定
	set -eu

	# gettextの設定
	TEXTDOMAIN='deb2sfs.sh'; export TEXTDOMAIN

	# プログラム名
	name='deb2sfs.sh'
	# バージョン
	version='0.1.0'
	# 最終更新日
	update='2018-06-22'

	# ヘルプメッセージ
	helpMessage=`cat <<EOF
\`gettext 'Usage'\`: ${0} [options] dest [source1] [source2] ...

\`gettext 'Converrt Debian package to SquashFS.'\`

\`gettext 'Options'\`:
  -c, --control                           \`gettext 'build Debian package control file'\`
  -n, --no-sfs                            \`gettext 'do not make SquashFS'\`
  -o name[:value], --option=name[:value]  \`gettext 'option of mksquashfs command'\`
  -h, --help                              \`gettext 'display this help and exit'\`
  -v, --verbose                           \`gettext 'enable verbose output'\`
  -V, --version                           \`gettext 'output version information and exit'\`

\`gettext 'Example'\`:
  ${0} output.sfs *.deb
  ${0} -cv output.sfs *.deb
  ${0} -o b:1048576 -o comp:xz -o Xdict-size:100% output.sfs *.deb
\`gettext 'See'\`: <http://sakurapup.com/forum1/viewtopic.php?f=31&t=3372>
EOF`
	# バージョンメッセージ
	versionMessage=`cat <<EOF
${name} version ${version} (update ${update})

\`gettext 'Licence'\`: CC-BY <https://creativecommons.org/licenses/by/4.0/>
\`gettext 'Using'\`: dpkg-deb, gettext, mksquashfs, sh, wget, etc
EOF`

	# 変数を固定
	readonly name version update helpMessage versionMessage

	## 終了時に一時ディレクトリを削除する
	endcall () {
		[ -n "${verboseFlag-}" ] && transrate '# Remove temporary directory #'
		rm -fr ${verboseFlag-} "${tmpDirectory}" "${tmpFile}"
	}

	## エラーメッセージを出力する
	errorMessage () {
		transrate "%s: ${1}" "${0}" 1>&2
		transrate "Try \`%s --help' for more information" "${0}" 1>&2

		# EX_USAGE (/usr/include/sysexits.h)
		exit 64
	}

	## クォートをネストする
	quote () {
		echo "'`echo \"${1}\" | sed -re \"s/([']+)/'\\\"\1\\\"'/g\"`'"
	}

	## メッセージを翻訳する
	transrate () {
		message="${1}"
		shift
		printf "`gettext \"${message}\"`\n" "${@}"
	}

	# 引数の解析
	while [ 0 -lt "${#}" ]; do
		case "${1}" in
			# Debianパッケージのcontrol
			'-c' | '--control')
				controlFlag=1
				shift
				;;
			# ヘルプメッセージ
			'-h' | '--help')
				echo "${helpMessage}"
				return 0
				;;
			# SquashFSを作成しない
			'-n' | '--no-sfs')
				nosfsFlag=1
				shift
				;;
			# mksquashfsのオプション
			'-o' | '--option')
				# オプションに引数がなかった場合
				[ "${#}" -lt 2 ] && {
					errorMessage "option '${1}' requires an argument"
				}

				options="${options-} "`quote "-${2}" | sed -e "s/:/' '/"`
				shift 2
				;;
			# 冗長な表示
			'-v' | '--verbose')
				verboseFlag='--verbose'
				shift
				;;
			# バージョンメッセージ
			'-V' | '--version')
				echo "${versionMessage}"
				return 0
				;;
			# 以降オプション以外の引数
			'-' | '--')
				shift

				while [ 0 -lt "${#}" ]; do
					parameters="${parameters-} "`quote "${1}"`
					shift
				done
				;;
			# ロングオプション
			--[!-]*=*)
				option="${1}"
				shift
				set -- "`echo \"${option}\" | cut -d = -f 1`" "`echo \"${option}\" | cut -d = -f 2-`" "${@}"
				;;
			# 複合ショートオプション
			-[!-][!-]*)
				option="${1}"
				shift
				set -- "-`echo \"${option}\" | cut -c 2`" "-`echo \"${option}\" | cut -c 3-`" "${@}"
				;;
			# 無効なオプション
			-*)
				errorMessage "unrecognized option '${1}'"
				;;
			# オプション以外の引数
			*)
				parameters="${parameters-} "`quote "${1}"`
				shift

				# POSIX標準ならば以降オプション以外の引数
				[ "`printenv 'POSIXLY_CORRECT' > /dev/null; echo \"${?}\"`" -eq 0 -o "`printenv 'ADSH_CMD_ARGORDER'`" = 'seq' ] && {
					set -- '--' "${@}"
				}
				;;
		esac
	done

	# 変数を固定
	readonly controlFlag nosfsFlag options parameters verboseFlag

	# オプション以外の引数の存在を確認
	[ -z "${parameters-}" ] && {
		errorMessage 'missing arguments'
	}

	# 位置パラメータを再セット
	eval "set ${parameters-}"

	# 先頭の位置パラメータから宛先を取り出す
	dest="${1}"
	shift

	# 一時ディレクトリを作成
	[ -n "${verboseFlag-}" ] && transrate '# Make temporary directory #'
	tmpDirectory=`mktemp -d`
	tmpFile=`mktemp`

	# 終了時に関数を呼び出す
	trap "endcall" EXIT
	trap "endcall; exit 129" 1
	trap "endcall; exit 130" 2
	trap "endcall; exit 131" 3
	trap "endcall; exit 143" 15

	# 変数を固定
	readonly dest tmpDirectory tmpFile

	# ${controlFlag}が有効ならば/etc/init.dを作成
	[ "${controlFlag-0}" -eq 1 ] && {
		initd="${tmpDirectory}/etc/init.d"
		[ -n "${verboseFlag-}" ] && transrate '# Make %s directory #' '/etc/init.d'
		mkdir -p ${verboseFlag-} "${initd}"
	}

	# 各Debianパッケージを処理
	for deb; do
		# 通信プロトコルならばタウンロード
		`echo "${deb}" | grep -qE '^https?://|^ftps?://'` && {
			[ -n "${verboseFlag-}" ] && transrate '# Download %s #' "${deb}"
			wget -nv ${verboseFlag-} -O "${tmpFile}" "${deb}"
			deb="${tmpFile}"
		}

		# Debianパッケージからファイルを取り出す
		[ -n "${verboseFlag-}" ] && transrate '# Extract files in %s #' "${deb}"
		dpkg-deb ${verboseFlag-} -x "${deb}" "${tmpDirectory}"

		[ "${controlFlag-0}" -eq 1 ] && {
			debname=`dpkg-deb -W --showformat='${Package}_${Version}_${Architecture}' "${deb}"`

			control="${tmpDirectory}/var/run/deb2sfs.sh/${debname}"

			[ -n "${verboseFlag-}" ] && transrate '# Make %s directory #' "/var/run/deb2sfs.sh/${debname}"
			mkdir -p ${verboseFlag-} "${control}"

			# Debianパッケージからコントロールファイルを取り出す
			[ -n "${verboseFlag-}" ] && transrate '# Extract control file in %s #' "${deb}"
			dpkg-deb ${verboseFlag-} -e "${deb}" "${control}"

			# サービス起動スクリプトを作成
			cat > "${initd}/${debname}.sh" <<EOF
#!/usr/bin/env sh

set -eu

control="/var/run/deb2sfs.sh/${debname}"
readonly control

case "\${1}" in
	'start')
		[ -x "\${control}/preinst" ] && "\${control}/preinst" 'install'
		[ -x "\${control}/postinst" ] && "\${control}/postinst" 'configure' "\`grep -m 1 '^Version:' \"\${control}/control\" | sed -e 's/^Version:[ ]*//'\`"
	;;
	'stop')
		[ -x "\${control}/prerm" ] && "\${control}/prerm" 'remove'
		[ -x "\${control}/postrm" ] && "\${control}/postrm" 'remove'
	;;
esac
EOF
			[ -n "${verboseFlag-}" ] && transrate '# Chenge mod %s #' "/etc/init.d/${debname}.sh"
			chmod ${verboseFlag-} 755 "${initd}/${debname}.sh"
		}
	done

	# 一部ディレクトリの内容を上位ディレクトリに移動
	for path in '/lib/i386-linux-gnu' '/usr/bin/i386-linux-gnu' '/usr/lib/i386-linux-gnu'; do
		[ -d "${tmpDirectory}${path}" ] && {
			[ -n "${verboseFlag-}" ] && transrate '# Move %s #' "${path}"
			cp -afT ${verboseFlag-} "${tmpDirectory}${path}" "${tmpDirectory}${path}/.."
			rm -fr ${verboseFlag-} "${tmpDirectory}${path}"
		}
	done

	# ${nosfsFlag}による処理の分岐
	if [ "${nosfsFlag-0}" -eq 1 ]; then
		# 一時ディレクトリの内容をコピー
		[ -n "${verboseFlag-}" ] && transrate '# Copy temporary directory to %s #' "${dest}"
		cp -afT ${verboseFlag-} "${tmpDirectory}" "${dest}"
	else
		# SquashFSの作成
		[ -n "${verboseFlag-}" ] && transrate '# Make %s #' "${dest}"
		eval "mksquashfs \"${tmpDirectory}\" \"${dest}\" ${options-}"
	fi
)

# メインの関数を呼び出す
deb2sfs "${@}"
第一引数にSquashFSのファイル名、以降の引数にDebianパッケージのファイル名を指定すると、変換を行います。

実験的な機能ですが、`-c`オプションでDebianパッケージに含まれているコントロールファイル(preinst, postinst, prerm, postrm)をロード、アンロード時に自動的に実行させることができます。 :|

`mksquashfs`コマンドにオプションを渡す場合は、`-o name[:value]`の形式で渡せます。`-n`オプションを付けるとSquashFSは作成されず、ディレクトリが作成されます。引数がURLであった場合、`wget`コマンドを使用してダウンロードを行います。

その他については`-h`オプションで簡単なヘルプを表示できます。

このスクリプトはPrecise-571JPで動作確認をしています。

あくまで見様見真似で悪戦苦闘しながら作成したものですので、バグや不具合、その他至らない点が多々あるかもしれません。その時はご報告頂ければ幸いでござます。

このスクリプトを作成するにあたっては、<viewtopic.php?f=12&t=3356>にてご回答いただきました、thinkpadnerdさん、ルビーさん、Zstepさんに改めて御礼申し上げます。この質問の解決なしに、このプログラムを作成することは不可能でした。 :P
💻Lenovo G550(CPU: Intel Celeron 900 @ 2.20GHz, RAM: 971MB, HDD: 149.05GiB) + Precise-571JP
🖥HITACHI FLORA 310 DL7(CPU: Intel Pentium III 700 MHz, RAM: 384MB) + Precise-571JP
アバター
タロ兵衛
記事: 875
登録日時: 08/07/08(火) 00:11
お住まい: よこはま
連絡する:

Re: deb2sfs.sh - deb(Debianパッケージ)をsfs(SquashFS)に変換するシェルスクリプト

投稿記事 by タロ兵衛 »

> for path in '/lib/i386-linux-gnu' '/usr/bin/i386-linux-gnu' '/usr/lib/i386-linux-gnu'; do
この辺、x86_64-linux-gnuに変えれば64ビット版も行けるかもですね。
少々気になるのは、この3種でカバーできるかな?と
手動はその時々で都合よくやってしまいますが、自動となると難しいですよね
neo実験君こと次期メインマシン
Intel Core i5-8400 2.80GHz
xenialpup64 7.5+lang_pack_ja-xenial64e
thinkpadnerd
記事: 2035
登録日時: 15/10/25(日) 14:00

Re: deb2sfs.sh - deb(Debianパッケージ)をsfs(SquashFS)に変換するシェルスクリプト

投稿記事 by thinkpadnerd »

deb2sfs.sh と ubuntu chromium の deb パッケージを使って sfs を作成してみました。ubuntu chromium の場合 3つのパッケージをまとめるので、*.deb を指定できるのは便利でした。ただ、私の場合、sfs を作る手間よりも、通信環境が貧弱なのでアップロードに時間がかかるのがネックだったりします。 :)

slimjet の sfs は単純に deb パッケージから変換するのではなく、メニュー項目など若干の変更を加える必要があるので、結局手作業になります。


help の内容ですが、Convert が Converrt になっています。

-n オプションの説明ですが、do not make SquashFS but directory などとしたほうが分かりやすいと思います。

引数がURLの場合の説明がないので、Example のところに示すなどしたらどうでしょうか。
ThinkPad X121e (Precise 571 / Tahr 605 / Tahr64 606 / Xenial 7.5 / Bionic32)
CPU AMD C-50 1.0GHz, RAM 4GB
ThinkPad L440 (Xenial 7.5 / Bionic64 / Fossa64)
CPU intel Celeron 2950M 2.0GHz, RAM 4GB
アバター
ルビー
記事: 1240
登録日時: 14/11/24(月) 12:12

Re: deb2sfs.sh - deb(Debianパッケージ)をsfs(SquashFS)に変換するシェルスクリプト

投稿記事 by ルビー »

thinkpadnerd さんが書きました:slimjet の sfs は単純に deb パッケージから変換するのではなく、メニュー項目など若干の変更を加える必要があるので、結局手作業になります。
slimjetのdebパッケージをsfs変換かけたら、失敗してしまったのだけど、何か作りが特殊なのかな。
debパッケージのサイズがでかいからか、作業環境の制限にでも引っ掛かったのかと思ったのだけど。
最後に編集したユーザー ルビー [ 18/06/23(土) 12:49 ], 累計 1 回
ssnys
記事: 64
登録日時: 14/02/19(水) 17:50

Re: deb2sfs.sh - deb(Debianパッケージ)をsfs(SquashFS)に変換するシェルスクリプト

投稿記事 by ssnys »

タロ兵衛さん、thinkpadnerdさん、ルビーさんご返信頂きまして誠にありがとうございます。 :)

昨日リリースしたばかりでございますが、早速小幅なバージョンアップを行いました。

コード: 全て選択

#!/usr/bin/env sh

## DebianパッケージをSquashFSに変換する
#
# @author ssnys
# @version 0.1.1
# @date 2018-06-23
# @licence https://creativecommons.org/licenses/by/4.0/
# @see http://sakurapup.com/forum1/viewtopic.php?f=31&t=3372

deb2sfs () (
    # shの設定
    set -eu

    # gettextの設定
    TEXTDOMAIN='deb2sfs.sh'; export TEXTDOMAIN

    # プログラム名
    name='deb2sfs.sh'
    # バージョン
    version='0.1.1'
    # 最終更新日
    update='2018-06-23'

    # ヘルプメッセージ
    helpMessage=`cat <<EOF
\`gettext 'Usage'\`: ${0} [\`gettext 'options'\`] \`gettext 'dest'\` [\`gettext 'package1'\`] [\`gettext 'package2'\`] \`gettext '...'\`

\`gettext 'Convert Debian package to SquashFS.'\`

\`gettext 'Options'\`:
  -c, --control                           \`gettext 'build Debian package control file'\`
  -n, --no-sfs                            \`gettext 'do not make SquashFS but directory'\`
  -o name[:value], --option=name[:value]  \`gettext 'option of mksquashfs command'\`
  -h, --help                              \`gettext 'display this help and exit'\`
  -v, --verbose                           \`gettext 'enable verbose output'\`
  -V, --version                           \`gettext 'output version information and exit'\`

\`gettext 'Example'\`:
  ${0} output.sfs *.deb
  ${0} -cv output.sfs *.deb
  ${0} -o b:1048576 -o comp:xz -o Xdict-size:100% output.sfs *.deb
  ${0} output.sfs 'http://www.example.com/example.deb'
\`gettext 'See'\`: <http://sakurapup.com/forum1/viewtopic.php?f=31&t=3372>
EOF`
    # バージョンメッセージ
    versionMessage=`cat <<EOF
${name} version ${version} (update ${update})

\`gettext 'Licence'\`: CC-BY <https://creativecommons.org/licenses/by/4.0/>
\`gettext 'Using'\`: dpkg-deb, gettext, mksquashfs, sh, wget\`gettext ', etc.'\`
EOF`

    # 変数を固定
    readonly name version update helpMessage versionMessage

    ## 終了時に一時ディレクトリを削除する
    endcall () {
        [ -n "${verboseFlag-}" ] && translate '# Remove temporary directory and temporary file #'
        rm -fr ${verboseFlag-} "${tmpDirectory}" "${tmpFile}"
    }

    ## エラーメッセージを出力する
    errorMessage () {
        translate "%s: ${1}" "${0}" 1>&2
        translate "Try \`%s --help' for more information" "${0}" 1>&2

        # EX_USAGE (/usr/include/sysexits.h)
        exit 64
    }

    ## クォートをネストする
    quote () {
        echo "'`echo \"${1}\" | sed -re \"s/([']+)/'\\\"\1\\\"'/g\"`'"
    }

    ## メッセージを翻訳する
    translate () (
        message="${1}"
        shift
        printf "`gettext \"${message}\"`\n" "${@}"
    )

    # 引数の解析
    while [ 0 -lt "${#}" ]; do
        case "${1}" in
            # Debianパッケージのcontrol
            '-c' | '--control')
                controlFlag=1
                shift
                ;;
            # ヘルプメッセージ
            '-h' | '--help')
                echo "${helpMessage}"
                return 0
                ;;
            # SquashFSを作成しない
            '-n' | '--no-sfs')
                nosfsFlag=1
                shift
                ;;
            # mksquashfsのオプション
            '-o' | '--option')
                # オプションに引数がなかった場合
                [ "${#}" -lt 2 ] && {
                    errorMessage "option '${1}' requires an argument"
                }

                options="${options-} "`quote "-${2}" | sed -e "s/:/' '/"`
                shift 2
                ;;
            # 冗長な表示
            '-v' | '--verbose')
                verboseFlag='--verbose'
                shift
                ;;
            # バージョンメッセージ
            '-V' | '--version')
                echo "${versionMessage}"
                return 0
                ;;
            # 以降オプション以外の引数
            '-' | '--')
                shift

                while [ 0 -lt "${#}" ]; do
                    parameters="${parameters-} "`quote "${1}"`
                    shift
                done
                ;;
            # ロングオプション
            --[!-]*=*)
                option="${1}"
                shift
                set -- "`echo \"${option}\" | cut -d = -f 1`" "`echo \"${option}\" | cut -d = -f 2-`" "${@}"
                ;;
            # 複合ショートオプション
            -[!-][!-]*)
                option="${1}"
                shift
                set -- "-`echo \"${option}\" | cut -c 2`" "-`echo \"${option}\" | cut -c 3-`" "${@}"
                ;;
            # 無効なオプション
            -*)
                errorMessage "unrecognized option '${1}'"
                ;;
            # オプション以外の引数
            *)
                parameters="${parameters-} "`quote "${1}"`
                shift

                # POSIX標準ならば以降オプション以外の引数
                [ "`printenv 'POSIXLY_CORRECT' > /dev/null; echo \"${?}\"`" -eq 0 -o "`printenv 'ADSH_CMD_ARGORDER'`" = 'seq' ] && {
                    set -- '--' "${@}"
                }
                ;;
        esac
    done

    # 変数を固定
    readonly controlFlag nosfsFlag options parameters verboseFlag

    # オプション以外の引数の存在を確認
    [ -z "${parameters-}" ] && {
        errorMessage 'missing arguments'
    }

    # 位置パラメータを再セット
    eval "set ${parameters-}"

    # 先頭の位置パラメータから宛先を取り出す
    dest="${1}"
    shift

    # 一時ディレクトリを作成
    [ -n "${verboseFlag-}" ] && translate '# Make temporary directory and temporary file #'
    tmpDirectory=`mktemp -d`
    tmpFile=`mktemp`

    # 終了時に関数を呼び出す
    trap "endcall" EXIT
    trap "endcall; exit 129" 1
    trap "endcall; exit 130" 2
    trap "endcall; exit 131" 3
    trap "endcall; exit 143" 15

    # 変数を固定
    readonly dest tmpDirectory tmpFile

    # ${controlFlag}が有効ならば/etc/init.dを作成
    [ "${controlFlag-0}" -eq 1 ] && {
        initd="${tmpDirectory}/etc/init.d"
        [ -n "${verboseFlag-}" ] && translate '# Make %s directory #' '/etc/init.d'
        mkdir -p ${verboseFlag-} "${initd}"
    }

    # 各Debianパッケージを処理
    for deb; do
        # URLならばタウンロード
        `echo "${deb}" | grep -qE '^https?://|^ftps?://'` && {
            [ -n "${verboseFlag-}" ] && translate '# Download %s #' "${deb}"
            wget -nv ${verboseFlag-} -O "${tmpFile}" "${deb}"
            deb="${tmpFile}"
        }

        # Debianパッケージからファイルを取り出す
        [ -n "${verboseFlag-}" ] && translate '# Extract files in %s #' "${deb}"
        dpkg-deb ${verboseFlag-} -x "${deb}" "${tmpDirectory}"

        # ${controlFlag}による処理の分岐
        [ "${controlFlag-0}" -eq 1 ] && {
            debname=`dpkg-deb -W --showformat='${Package}_${Version}_${Architecture}' "${deb}"`

            control="${tmpDirectory}/var/run/deb2sfs.sh/${debname}"

            [ -n "${verboseFlag-}" ] && translate '# Make %s directory #' "/var/run/deb2sfs.sh/${debname}"
            mkdir -p ${verboseFlag-} "${control}"

            # Debianパッケージからコントロールファイルを取り出す
            [ -n "${verboseFlag-}" ] && translate '# Extract control file in %s #' "${deb}"
            dpkg-deb ${verboseFlag-} -e "${deb}" "${control}"

            # サービス起動スクリプトを作成
            cat > "${initd}/${debname}.sh" <<EOF
#!/usr/bin/env sh

set -eu

control="/var/run/deb2sfs.sh/${debname}"
readonly control

case "\${1}" in
    'start')
        [ -x "\${control}/preinst" ] && "\${control}/preinst" 'install'
        [ -x "\${control}/postinst" ] && "\${control}/postinst" 'configure' "\`grep -m 1 '^Version:' \"\${control}/control\" | sed -e 's/^Version:[ ]*//'\`"
    ;;
    'stop')
        [ -x "\${control}/prerm" ] && "\${control}/prerm" 'remove'
        [ -x "\${control}/postrm" ] && "\${control}/postrm" 'remove'
    ;;
esac
EOF
            [ -n "${verboseFlag-}" ] && translate '# Chenge mod %s #' "/etc/init.d/${debname}.sh"
            chmod ${verboseFlag-} 755 "${initd}/${debname}.sh"
        }
    done

    # 一部ディレクトリの内容を上位ディレクトリに移動
    for path in '/lib/i386-linux-gnu' '/usr/bin/i386-linux-gnu' '/usr/lib/i386-linux-gnu'; do
        [ -d "${tmpDirectory}${path}" ] && {
            [ -n "${verboseFlag-}" ] && translate '# Move %s #' "${path}"
            cp -afT ${verboseFlag-} "${tmpDirectory}${path}" "${tmpDirectory}${path}/.."
            rm -fr ${verboseFlag-} "${tmpDirectory}${path}"
        }
    done

    # ${nosfsFlag}による処理の分岐
    if [ "${nosfsFlag-0}" -eq 1 ]; then
        # 一時ディレクトリの内容をコピー
        [ -n "${verboseFlag-}" ] && translate '# Copy temporary directory to %s #' "${dest}"
        cp -afT ${verboseFlag-} "${tmpDirectory}" "${dest}"
    else
        # SquashFSの作成
        [ -n "${verboseFlag-}" ] && translate '# Make %s #' "${dest}"
        eval "mksquashfs \"${tmpDirectory}\" \"${dest}\" ${options-}"
    fi
)

# メインの関数を呼び出す
deb2sfs "${@}"
ご指摘頂いた誤記などを含め、以下の点について修正致しました。
  • ヘルプメッセージの修正と追記
  • verboseメッセージの一部を修正
  • インデント幅をスペース3からスペース4に変更
  • 内部関数のtransrateをtranslateに修正
  • translate関数をグループコマンドからサブシェルに変更
  • ソースコメントを少しだけ追加、及び修正
タロ兵衛 さんが書きました: > for path in '/lib/i386-linux-gnu' '/usr/bin/i386-linux-gnu' '/usr/lib/i386-linux-gnu'; do
この辺、x86_64-linux-gnuに変えれば64ビット版も行けるかもですね。
少々気になるのは、この3種でカバーできるかな?と
手動はその時々で都合よくやってしまいますが、自動となると難しいですよね
`'/lib/i386-linux-gnu' '/usr/bin/i386-linux-gnu' '/usr/lib/i386-linux-gnu'`はPrecise-571JPのpuppy_precise_5.7.1JP.sfsでシンボリックリンクとなっており、追加のSFSロード時に、この3つのディレクトリ以下の内容はマージされないようなので、対応策として内容を上位ディレクトリにコピーしている次第です。

64ビット版のPuppy Lunuxは使用したことがない(そもそも64ビットのPCを持っていない :!: )ため、確かな事は言えませんが、x86_64-linux-gnuに変更すれば64ビット版でも動作すると思います。
thinkpadnerd さんが書きました: help の内容ですが、Convert が Converrt になっています。

-n オプションの説明ですが、do not make SquashFS but directory などとしたほうが分かりやすいと思います。

引数がURLの場合の説明がないので、Example のところに示すなどしたらどうでしょうか。
ご指摘ありがとうございます。早速修正させて頂きました。当方英語が不得意なため、スペルミスやメッセージの修正などのご指摘は誠にありがたい限りでございます。
ルビー さんが書きました:
thinkpadnerd さんが書きました: slimjet の sfs は単純に deb パッケージから変換するのではなく、メニュー項目など若干の変更を加える必要があるので、結局手作業になります。
slimjetのdebパッケージをsfs変換かけたら、失敗してしまったのだけど、何か作りが特殊なのかな。
debパッケージのサイズがでかいからか、作業環境の制限にでも引っ掛かったのかと思ったのだけど。
当方の方でもこのスクリプトを利用してslimjetのDebianパッケージがSquashFSに変換手可能か少し調査してみたいと思います。
💻Lenovo G550(CPU: Intel Celeron 900 @ 2.20GHz, RAM: 971MB, HDD: 149.05GiB) + Precise-571JP
🖥HITACHI FLORA 310 DL7(CPU: Intel Pentium III 700 MHz, RAM: 384MB) + Precise-571JP
thinkpadnerd
記事: 2035
登録日時: 15/10/25(日) 14:00

Re: deb2sfs.sh - deb(Debianパッケージ)をsfs(SquashFS)に変換するシェルスクリプト

投稿記事 by thinkpadnerd »

”ルビーさんが書きました:
> slimjetのdebパッケージをsfs変換かけたら、失敗してしまったのだけど、何か作りが特殊なのかな。
> debパッケージのサイズがでかいからか、作業環境の制限にでも引っ掛かったのかと思ったのだけど。

slimjet の deb パッケージを変換してみました。コマンドは正常に終了し、sfs ができました。(たまたま tazpup を起動しているので、tazpup 上で試行)
他の puppy でも検証する必要はあるかもしれません。

作業領域はある程度のサイズが必要ですし、linux のファイルシステムが必要だと思います。


> slimjetをdebパッケージからインストールして使ってみましたが、Bingを表示させると、不正な~とか出て閉じられてしまう。

私が公開している sfs で bing を見てみましたが、問題なかったですよ。(tahrpup と xenialpup)
ともあれ、slimjet の挙動に関しては、このスレッドはふさわしくないので、必要でしたら、続きは slimjet のスレッドで...
ThinkPad X121e (Precise 571 / Tahr 605 / Tahr64 606 / Xenial 7.5 / Bionic32)
CPU AMD C-50 1.0GHz, RAM 4GB
ThinkPad L440 (Xenial 7.5 / Bionic64 / Fossa64)
CPU intel Celeron 2950M 2.0GHz, RAM 4GB
アバター
ルビー
記事: 1240
登録日時: 14/11/24(月) 12:12

Re: deb2sfs.sh - deb(Debianパッケージ)をsfs(SquashFS)に変換するシェルスクリプト

投稿記事 by ルビー »

thinkpadnerd さんが書きました:作業領域はある程度のサイズが必要ですし、linux のファイルシステムが必要だと思います。
pupsaveを256MB → 512MBで試してみましたが、失敗しました。
VirtualBoxの571JPです。
slimjet_i386.deb をpupsaveの中と外に置いてもやってみました。
pupsaveの外も、ext4です。

エラーメッセージです。
# deb2sfs.sh slimjettest.sfs slimjet_i386.deb
tar: ./opt/slimjet/slimjet: 10240 バイトのうち、6656 バイトのみ書き込 みました
tar: ./opt/slimjet/natives_blob.bin: write 不能: No space left on device
tar: ./opt/slimjet/nacl_helper_bootstrap: write 不能: No space left on device
tar: ./usr/share/menu/slimjet.menu: write 不能: No space left on device
tar: ./usr/share/applications/slimjet.desktop: write 不能: No space left on device
tar: ./usr/share/gnome-control-center/default-apps/slimjet.xml: write 不能: No space left on device
tar: ./usr/share/pixmaps/slimjet.xpm: write 不能: No space left on device
tar: Exiting with failure status due to previous errors
dpkg-deb: error: subprocess tar returned error exit status 2
thinkpadnerd さんが書きました:ともあれ、slimjet の挙動に関しては、このスレッドはふさわしくないので、必要でしたら、続きは slimjet のスレッドで...
そう思って消すつもりでしたが、遅かったですね(^^;。
半分寝ながら書いて記述も間違ってるので、一応消しました。
引用には残っちゃうけど、ま、いいか。
続きは、あっちにします。
thinkpadnerd
記事: 2035
登録日時: 15/10/25(日) 14:00

Re: deb2sfs.sh - deb(Debianパッケージ)をsfs(SquashFS)に変換するシェルスクリプト

投稿記事 by thinkpadnerd »

”ルビーさんが書きました:
> エラーメッセージです。
> # deb2sfs.sh slimjettest.sfs slimjet_i386.deb
> tar: ./opt/slimjet/slimjet: 10240 バイトのうち、6656 バイトのみ書き込 みました
> tar: ./opt/slimjet/natives_blob.bin: write 不能: No space left on device

No space left on device は文字通り、デバイスにスペースが(残されてい)ない、ということですが...

deb パッケージのサイズ + deb を展開したファイルのサイズ + sfs のサイズ + α
が必要だと思いますが、展開の途中でスペースがなくなるというのはどういうことでしょうね。私は puppy がインストールされているパーティションが NTFS なので、別に ext2 のパーティションを用意して作業しています。

あと、念のためですが、現行の slimjet は precise をサポートしていません。
ThinkPad X121e (Precise 571 / Tahr 605 / Tahr64 606 / Xenial 7.5 / Bionic32)
CPU AMD C-50 1.0GHz, RAM 4GB
ThinkPad L440 (Xenial 7.5 / Bionic64 / Fossa64)
CPU intel Celeron 2950M 2.0GHz, RAM 4GB
アバター
ルビー
記事: 1240
登録日時: 14/11/24(月) 12:12

Re: deb2sfs.sh - deb(Debianパッケージ)をsfs(SquashFS)に変換するシェルスクリプト

投稿記事 by ルビー »

thinkpadnerd さんが書きました:deb パッケージのサイズ + deb を展開したファイルのサイズ + sfs のサイズ + α
が必要だと思いますが、展開の途中でスペースがなくなるというのはどういうことでしょうね。
ふ~む。
512MBのpupsaveでも足りないかもしれないって事ですね。
571JPをインストールしてあるディスクの空きは十分あると思いますが、仮想ハードディスクだしな~。
仮想だと問題があるのかな。
thinkpadnerd さんが書きました:あと、念のためですが、現行の slimjet は precise をサポートしていません。
はい。
後で知りました(^^;。
大きいサイズのdebパッケージ探して、これが見つかったので、サンプルにしちゃいました。
ssnys
記事: 64
登録日時: 14/02/19(水) 17:50

Re: deb2sfs.sh - deb(Debianパッケージ)をsfs(SquashFS)に変換するシェルスクリプト

投稿記事 by ssnys »

thinkpadnerdさん、ルビーさんご返信頂きまして誠にありがとうございます。 :)
ssnys さんが書きました: 当方の方でもこのスクリプトを利用してslimjetのDebianパッケージがSquashFSに変換手可能か少し調査してみたいと思います。
調査するつもりだったのですが、当方の遅いネット環境ですとslimjetのDebianパッケージダウンロード中にタイムアウトしてしまうようで、未だ調査できておりません。調査にはもう少し時間が掛かりそうです。申し訳ないかぎりです。 :(
ルビー さんが書きました:
thinkpadnerd さんが書きました: deb パッケージのサイズ + deb を展開したファイルのサイズ + sfs のサイズ + α
が必要だと思いますが、展開の途中でスペースがなくなるというのはどういうことでしょうね。
ふ~む。
512MBのpupsaveでも足りないかもしれないって事ですね。
571JPをインストールしてあるディスクの空きは十分あると思いますが、仮想ハードディスクだしな~。
仮想だと問題があるのかな。
slimjetのDebianパッケージを解凍しても問題ない十分なディスクスペースがあると仮定して、以下のようなコマンドで解凍できませんか?

コード: 全て選択

mkdir -p test
dpkg-deb -x <package> test
もしこれで解凍できなければ、考えられる理由の一つとして、dpkg-debやそれに依存するライブラリなどのバージョンが低いため、解凍できないのかもしれません。あくまで当てずっぽうの予測ですが… :|
💻Lenovo G550(CPU: Intel Celeron 900 @ 2.20GHz, RAM: 971MB, HDD: 149.05GiB) + Precise-571JP
🖥HITACHI FLORA 310 DL7(CPU: Intel Pentium III 700 MHz, RAM: 384MB) + Precise-571JP
アバター
ルビー
記事: 1240
登録日時: 14/11/24(月) 12:12

Re: deb2sfs.sh - deb(Debianパッケージ)をsfs(SquashFS)に変換するシェルスクリプト

投稿記事 by ルビー »

Slimjetのdebパッケージですが、試しに901Xの571JPでsfs変換してみたら成功しました。
作成したsfsをXenialpupでロードして、起動もOKです。

901Xの571JPは、SDHCカードにFrugalインストール、pupsave 256MB、空き148MB。
VirtualBoxと条件を合わせる為に、@date 2018-06-22 版で試しました。
これで成功するって事は、VirtualBoxの571JPに原因がありそうですが何だろう?
また、試してみます。

他のdebパッケージをsfs変換した時もそうでしたが、登録メニューのアイコンだけが出ないです。
thinkpadnerd
記事: 2035
登録日時: 15/10/25(日) 14:00

Re: deb2sfs.sh - deb(Debianパッケージ)をsfs(SquashFS)に変換するシェルスクリプト

投稿記事 by thinkpadnerd »

”ルビーさんが書きました:
> 他のdebパッケージをsfs変換した時もそうでしたが、登録メニューのアイコンだけが出ないです。

これは、変換に問題があるわけではなく、もとの deb パッケージに原因があると思われます。

/usr/share/applications/*.desktop にアイコンの記述があります。
アイコンの場所を確認して、フルパスで指定してやれば表示されます。それでも表示されない場合は、適切なサイズのアイコン(大き過ぎないもの)を指定してやると表示されると思います。
ThinkPad X121e (Precise 571 / Tahr 605 / Tahr64 606 / Xenial 7.5 / Bionic32)
CPU AMD C-50 1.0GHz, RAM 4GB
ThinkPad L440 (Xenial 7.5 / Bionic64 / Fossa64)
CPU intel Celeron 2950M 2.0GHz, RAM 4GB
アバター
ルビー
記事: 1240
登録日時: 14/11/24(月) 12:12

Re: deb2sfs.sh - deb(Debianパッケージ)をsfs(SquashFS)に変換するシェルスクリプト

投稿記事 by ルビー »

thinkpadnerd さんが書きました:/usr/share/applications/*.desktop にアイコンの記述があります。
アイコンの場所を確認して、フルパスで指定してやれば表示されます。
/root/.jwmrc を編集するのだと思いますが、例えば他のsfsをロードすると、手動で変更した箇所は元に戻されてしまいます。
その際は、また編集するのでしょうか。
他に良い方法がある?

以前、.jwmrcに自分用のメニューを追加したりしていて、気が付きました。
/root/.jwmrc-tray は勝手に書き換わったりしないので、そちらを使いやすい様に編集しています。
アバター
ルビー
記事: 1240
登録日時: 14/11/24(月) 12:12

Re: deb2sfs.sh - deb(Debianパッケージ)をsfs(SquashFS)に変換するシェルスクリプト

投稿記事 by ルビー »

ssnys さんが書きました:slimjetのDebianパッケージを解凍しても問題ない十分なディスクスペースがあると仮定して、以下のようなコマンドで解凍できませんか?
VirtualBoxの571JPで、slimjet_i386.deb(59MB)を dpkg-deb -x で解凍可能な状態でも、sfs変換に失敗しました。
pupsaveの中(/root/~)、外(/mnt/home/~/)で試しましたが、同じ結果です。
ちなみに、pupsave 256MB では、空き不足になって解凍不可でした。

VirtualBoxのXenialpupでも、slimjet_i386.debのsfs変換を試してみましたが失敗。
そこで、R40(RAM256MB)の571JPで試してみると、同様のエラーメッセージで失敗しました。
VirtualBoxのRAMは 896MB なのですが、もしかして、これでは足りないのかもしれません。
変換に成功した901XのRAMは 1GB です。

901Xの571JPでは、pupsave(256MB)の空き不足で失敗するだろうと思って試したのですけど、あっさり成功しました。
SDHCカードにインストールしてあるpupsaveの書き込みは、ハードディスクにインストールした場合と違うので、その為だと思いますが、RAMは 1GB あるので成功したのかな。

大きなサイズのdebパッケージのsfs変換では、大きめのRAMがないと無理かもしれない。
アバター
タロ兵衛
記事: 875
登録日時: 08/07/08(火) 00:11
お住まい: よこはま
連絡する:

Re: deb2sfs.sh - deb(Debianパッケージ)をsfs(SquashFS)に変換するシェルスクリプト

投稿記事 by タロ兵衛 »

ルビー さんが書きました:/root/.jwmrc を編集するのだと思いますが、例えば他のsfsをロードすると、手動で変更した箇所は元に戻されてしまいます。
その際は、また編集するのでしょうか。
他に良い方法がある?
私の場合、sfsインストール後ではなく、sfs化する直前にsfs化用ディレクトリの./usr/share/applicationsにある.desktop を書き換えてしまってます。これって不味いのかしら?
neo実験君こと次期メインマシン
Intel Core i5-8400 2.80GHz
xenialpup64 7.5+lang_pack_ja-xenial64e
返信する