[JM:03884] [POST: DP] modprobe.8 (kmod-29)

Back to archive index
長南洋一 cyoic****@maple*****
2022年 9月 21日 (水) 11:14:52 JST


<STATUS>
stat: DP
ppkg: kmod (version 29)
page: modprobe.8
date: 2022/09/21
mail: cyoic****@maple*****
name: Chonan Yoichi
</STATUS>

翻訳に迷っている箇所や、私の訳がどうしてこうなったかを説明しておきたい
箇所について書いておきます。例によって、かなり長くなってしまいました。

まず、kmod ツール群全体に関わることですが、"insert/remove" の訳語を
どうするかの問題があります。

私としては、「組み込み/取り外し」が自然な表現だと思います。
でも、module-init-tools 時代の古い modprobe の翻訳や、今回の
kmod パッケージの翻訳は、「登録/削除」を使っています。「登録」には、
どういう根拠と言うか、理由があるのでしょうか。なお、[JM:03874]
にも書きましたが、ITmedia の西村さんの記事は、私と同じように、
「組み込み/取り外し」ですし (「ロード/アンロード」も使っている)、
先日本屋で見た「動かしながらゼロから学ぶ Linux カーネルの教科書」
(末安泰三 日経BP) でも「組み込み/取り外し」を使っていました。
Web で調べたところでは、「取り込み/取り外し」(日経XTECH) や
「読み込み/アンロード」(RedHat) を使っているところもあります。また、
「ロード/アンロード」で済ませている人もいます。

どれを使うのが妥当なのでしょうか。なお、私は「組み込み/取り外し」のほかに、
"add/remove" に対して、「着脱」や「追加/取り外し」も使っています。
原文が "load" の場合の訳語は、たいてい「ロード」です。

○ DESCRIPTION の最初のパラグラフの最後の文について
    ... modprobe will also use module options specified on the kernel
    command line in the form of <module>.<option> and blacklists
    in the form of modprobe.blacklist=<module>.

  私は、7 月 17 日付けの [JM:03862] で「私の推測では、ブラックリストも
  カーネルのコマンドラインで指定するのだと思います」と書き、次のような
  試訳を付けておきました。

    ... modprobe はまた、カーネルコマンドラインで指定された、 モジュール
    オプションやブラックリストも使用します。前者の書式は <module>.<option>
    であり、後者の書式は modprobe.blacklist=<module> です。

  この推測は、正しかったようです。archlinux の解説ページに以下のようなことが
  書いてありました。書式がちょっと違いますけれど、カーネルコマンドラインで
  ブラックリストも指定できるということは分かります。
  (https://wiki.archlinux.jp/index.php/カーネルモジュール)

  > ブートローダでモジュールをブラックリスト入りさせることもできます。
  > カーネルパラメータのページで説明されているようにして、あなたの
  > ブートローダのカーネルラインに module_blacklist=modname1,modname2,modname3 
  > を追加するだけです。

  また、SUSE の解説にも同様のことが書いてありました。こちらはブラックリストの
  書式も modprobe(8) の manpage と同じです。
  (https://documentation.suse.com/ja-jp/sles/15-SP1/html/SLES-all/cha-mod.html)

  > カーネルモジュールを一時的にのみ無効にするには、ブート時に
  > オンザフライでブラックリスト化します。そのためには、ブート画面が
  > 表示されたらEキーを押します。最小限のエディタが表示され、
  > そこでブートパラメータを変更できます。次のような行を見つけます。
  >
  >    linux /boot/vmlinuz...splash= silent quiet showopts
  >
  > 行の最後にmodprobe.blacklist=MODULE_NAMEコマンドを追加します。

○ DESCRIPTION の三番目のパラグラフ
    modprobe expects an up-to-date modules.dep.bin file as generated by the
    corresponding depmod utility shipped along with modprobe (see
    depmod(8)).

    modprobe は、modules.dep.bin ファイルが最新であることを当てにしていま
    す。 このファイルは、modprobe と一緒に配布され、この modprobe に対応し
    ている depmod(8) ユーティリティによって生成されます (depmod(8) 参照)。

  "corresponding" というのが、イマイチわかりません。上の訳のようなことだと
  思うのですが...。 ああ、そうか、昔の depmod は modules.dep しか作らなかった。
  今では、バイナリの modules.dep.bin も作るようになっている。今の modprobe は、
  modules.dep.bin の方を使うのだから、現在の depmod は、当然だが、現在の
  modprobe に対応している。そういうこと言っているのかもしれません。それなら、
  「modprobe と一緒に配布されて、現在の modprobe に対応している depmod(8)
  ユーティリティ」の方がよいかも。

○ --dump-modversions
    Print out a list of module versioning information required by a
    module. This option is commonly used by distributions in order to
    package up a Linux kernel module using module versioning deps.

    あるモジュールが要求している、モジュールのバージョンに関する情報の
    リストを表示します。 このオプションは、普通ディストリビューションに
    よって使用され、 モジュールのバージョンに関する依存情報を使って
    Linux のカーネルモジュールをパッケージにまとめるの使われます。

  内容がよく分からないで訳しています。[JM:03862] にも書きましたが、
  "versioning information" というのは、何なんでしょう。"version
  information" と同じなんでしょうか、違うんでしょうか。

  "module versioning deps" の "deps" もよく分かりません。一応、
  "dependencies" と取って、「依存情報」としておきました。

  と書きましたが、--force-modversion について調べているうちに、
  すこし分かってきました。

  https://enakai00.hatenablog.com/entry/20110509/1304910773
  「vermagic と modversions に関する覚え書き」によれば:

  カーネルについては、

  >  CONFIG_MODVERSIONS を有効にしてカーネルをコンパイルすると、カーネルが
  > モジュールに公開するシンボル名(モジュールから呼び出し可能なカーネル内部の
  > 関数名など)について、個々に特殊な『チェックサム』が付与されます。
  >  このチェックサムは、関数の引数のタイプなどから計算されるもので、関数の仕様が
  > 変化するとそれにあわせてチェックサムも変化することになります。
  >       --------
  >  それぞれのカーネルが持つシンボルのチェックサムは、カーネルソースの
  > Module.symvers に記録されています。

  一方モジュールについては、

  >  モジュールのコンパイル時に、モジュールが利用する全てのシンボルに対して、
  > コンパイルに使用したカーネルが持つ該当シンボルのチェックサムがモジュール内に
  > 記録されます。
  >  モジュールに記録されたチェックサムは次のコマンドで確認できます。
  >     modprobe --dump-modversions /lib/modules/(中略)/ips.ko

  だそうです。"module versioning information" というのは、「モジュールの
  バージョン情報」と言うより、もう少し間接的と言うか、微妙で複雑なバージョン
  関係の情報なんですね。「モジュールのバージョンに関する情報」で一応よさそう
  ですが、もっとピッタリのものがあったら、お教えください。

○ --force-modversion
    When modules are compiled with CONFIG_MODVERSIONS set, a section
    detailing the versions of every interfaced used by (or supplied by)
    the module is created.

    モジュールをコンパイルするとき、CONFIG_MODVERSIONS を有効にすると、
    そのモジュールが利用する (あるいは、提供する) すべてのインター
    フェースのバージョンを記録したセクションが、モジュール内に作られます。 

  "the versions of every interfaced" ですが、最後の 'd' はタイポのようです。
  module-init-tools 時代の modprobe.8 に、この 'd' は存在しませんから。
  なお、「モジュール内に」は訳者による補足です。あった方が分かりやすいと思うので。

  次の英文は、--force-modversion の説明で、上に続く部分です。

    ... If a module fails to load and the kernel
    complains that the module disagrees about a version of some
    interface, you can use "--force-modversion" to remove the version
    information altogether.

  上述の「vermagic と modversions に関する覚え書き」には、このエラー
  メッセージについてこんな風に書いてありました。

  >   vermagic が無効化されていて、かつ modversions が有効化されている場合は、
  >  ロードしようとするモジュールに含まれる各シンボルのチェックサムと実行中の
  >  カーネルに含まれる該当シンボルのチェックサムが 比較されます。チェックサムが
  >  異なるシンボルがあるとロードに失敗して、"disagrees about version of
  >  symbol HOGEHOGE" のようなエラーが出力されます。

  つまり、"the module disagrees about a version of some interface,"
  の部分は、直訳すると、「このモジュールは、あるインターフェースのバージョン
  について、一致しない (同意しない、異議を唱えている)」になるのでしょう。
  このままでは、何と一致しないのか分からないので、そこを補い、構文も変更しました。
  現在の訳はこんな具合です。

    ... モジュールのロードに失敗して、カーネルが「モジュールのイン
    ターフェースに、カーネル側とバージョンが一致しないものがある」と
    苦情を言って来る場合、"--force-modversion" を使えば、そうした
    バージョン情報をそっくり削除することができます。

  以上の二箇所の内容は、depmod.8 の -E (--symvers Module.symvers)
  オプションの説明と関連しているようです。つまり、その説明の "this reports
  any symbol versions supplied by modules that do not match with
  the symbol versions provided by the kernel in its Module.symvers."
  ですが、これは、ここで取り上げた話と、まさに対応しています。そうすると、
  この説明中の "supplied" は、「供給する」と訳して済ますわけには行かない
  かもしれません。「vermagic と modversions に関する覚え書き」によれば、
  「モジュールのコンパイル時に、モジュールが利用する全てのシンボルに対して、
  コンパイルに使用したカーネルが持つ該当シンボルのチェックサムがモジュール内に
  記録される」ということなので、カーネルの情報と比べられるものには、
  モジュールが提供するシンボルだけでなく、利用するシンボルも含まれるので
  しょうから。「提示する」くらいが適当でしょうか。そうすると、depmod.8 の
  -E の説明の問題部分は、こんな訳になります、
  
    ... モジュールが提示しているシンボルのバージョンの中に、カーネルがその
    Module.symvers で情報を提供しているシンボルのバージョンとマッチしない
    ものがあれば、それを報告します。

○ -q, --quiet
    With this flag, modprobe won't print an error message if you try to
    remove or insert a module it can't find (and isn't an alias or
    install/remove command). However, it will still return with a
    non-zero exit status. The kernel uses this to opportunistically
    probe for modules which might exist using request_module.

    このフラグを使用すると、modprobe は、モジュールを取り外したり、 組み
    込んだりしようとして、それが見つからなかった場合に (しかも、それが
    エイリアスの名前でも、install や remove コマンドの対象でもなかった
    場合に)、エラーメッセージを出さなくなります。それでも、ゼロ以外の
    ステータスで終了することに変わりはありません。 なお、カーネルは、
    存在するかどうかが不確かなモジュールの探索を request_module 関数を
    使って便宜主義的に行うために、このフラグを使用します。

  "The kernel uses this to opportunistically probe for modules
  which might exist using request_module." の部分がよく分かりませんでした。
  でも、request_module というのは、関数らしい。それも、カーネルの関数らしい。
  それで、カーネルソースをもらってきて調べてみました。

  私はプログラミングは素人ですし、ましてカーネルのことなんてさっぱり分かり
  ませんから、間違えているかもしれませんが、request_module (__request_module)
  については、include/linux/kmod.h や kernel/kmod.c あたりに記述があり、
  call_modprobe 関数経由で実際に "modprobe -q" を実行しているようです。
  __request_module 関数の記述の直前には、こんなコメントも書いてありました。

    * Load a module using the user mode module loader. The function returns
    * zero on success or a negative errno code or positive exit code from
    * "modprobe" on failure. Note that a successful module load does not mean
    * the module did not then unload and exit on an error of its own. Callers
    * must check that the service they requested is now available not blindly
    * invoke it.

  https://www.kernel.org/doc/htmldocs/kernel-api/API---request-module.html
  にも、同文があります。

  私の理解は、正しいでしょうか。カーネルがその中からシェルコマンドを呼び出して
  いるなんて。信じられないのですが。

  信じられないでも、取りあえず信じて、--quiet オプションの説明を上のように
  訳したわけです。カーネルが request_module 関数で modprobe コマンドを
  使うということを知っていないと、何を言っているのか不得要領な文章ですが、
  これは原文が説明不足なのだと思います。

  それとも、私が間違っていて、別の解釈があるのでしょうか。

  私の理解が間違っていないとすれば、"The kernel uses this" の "this" を
  「このフラグ」と取ってよいわけですが、カーネルが modprobe コマンドを
  使っているなんて、(私だけでなく) 普通のユーザには信じられないのではないで
  しょうか。そんなこと考えもしないから、「カーネル」と「このフラグ」の
  結びつきが唐突すぎて、意味不明になるのではないかと思います。いっそ、
  カーネルが modprobe コマンドを使っているなんてことは忘れて、"this" を
  「この動作」ぐらいに訳したほうがよいのかもしれません。それでちゃんとつながるかを
  見るために、「この動作」に変えた -q の説明の全文を挙げておきます。

    このフラグを使用すると、modprobe は、モジュールを取り外したり、組み
    込んだりしようとして、それが見つからなかった場合に (しかも、それが
    エイリアスの名前でも、install や remove コマンドの対象でもなかっ
    た場合に)、エラーメッセージを出さなくなります。それでも、ゼロ以外の
    ステータスで終了することに変わりはありません。なお、カーネルは、存在
    するかどうかが不確かなモジュールの探索を request_module 関数を使って
    便宜主義的に行うために、この動作を使用 (採用) しています。

  やっぱり「カーネル」が出てくるのが唐突です。それに、「この動作」にちょっと
  無理があります。modprobe と直接関係がないような書き方をするなら、「同様の動作」
  と言わないと不自然でしょう。でも、そうしたところで、なんでここにカーネルの話が
  出てくるのか分からないことに変わりはありません。"The kernel uses this"
  以下は、最初から、書かなくてもよい、むしろ書かない方がよい情報だったのではないで
  しょうか。

  それから、"opportunistically" を「便宜主義的」と訳したことにも満足して
  いません。「日和見的」もしっくりしないし、なにかよい訳し方はないでしょうか。

最後に、添付ファイルの構成を書いておきます。

$ tar tzf modprobe.8.tar.gz 
kmod/
kmod/draft/
kmod/draft/man8/
kmod/draft/man8/modprobe.8
kmod/po4a/
kmod/po4a/modprobe.8.po
kmod/po4a/add_ja/
kmod/po4a/add_ja/copyright/
kmod/po4a/add_ja/copyright/modprobe.8.txt
kmod/original/
kmod/original/man8/
kmod/original/man8/modprobe.8

-- 
長南洋一
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: modprobe.8.tar.gz
型:         application/octet-stream
サイズ:     12485 バイト
説明:       無し
URL:        <https://lists.osdn.me/mailman/archives/linuxjm-discuss/attachments/20220921/c05eefa9/attachment-0001.obj>


linuxjm-discuss メーリングリストの案内
Back to archive index